这些天都在苦苦挣扎。
问题出在构造函数调用上。
我写了一段代码,比如:
#include <iostream>
using namespace std;
class Foo
{
private: int _n;
public:
Foo() { Foo(5);}
Foo(int n) {_n=n; cout << n << endl; }
};
int main()
{
Foo* foo = new Foo();
return 0;
}当我使用默认构造函数在外部构造Foo对象时:
Foo* f = new Foo();我假设变量_n是5,然而,它不是。
这在Java中是可以的,但在c++中就不行。
此外,在Visual C++ 6sp6中,
Foo() {this->Foo(5);}很管用。
但是,这个表达式被gcc/g++ 4拒绝了。
最后,我找到了解决方案。
只需将默认构造函数更改为
Foo() {Foo(5);}转到
Foo() { new (this) Foo(5); }解决了问题。
括号中的"this“是做什么的?
发布于 2012-07-19 02:50:10
(this)所做的是在this所指向的位置创建一个全新的Foo对象(这称为放置新对象)。您应该只在char和unsigned char的数组中使用它,而不应该在其他地方使用(而且几乎永远不会在其他地方使用)。由于您是在this已经开始构建的位置构建Foo,所以您所做的是未定义的行为,并且如果您有基类,则会到处泄漏资源。从历史上看,通常的做法只是将初始化移到私有函数中。
class Foo {
public:
Foo() { init(5);}
Foo(int n) {init(n);}
private:
int _n;
void init(int n) {
_n=n;
};
}在C++11中,构造函数应该能够使用这种语法相互调用,但我还不知道哪些编译器支持它。According to Apache,有GCC 4.7和Clang 3.0支持,但还不支持英特尔C++和VC++。
class Foo {
public:
Foo() : Foo(5) {}
Foo(int n) {_n=n;}
private:
int _n;
}从Foo() { Foo(5);}开始的代码开始构造this,然后使用参数5在堆栈上创建一个全新的Foo对象,然后销毁它,然后将其视为完全构造的对象,而不初始化它自己的任何值。这就是为什么它编译并运行,但似乎没有做任何事情的原因。
发布于 2012-07-19 02:49:15
在C++11中,您可以使用委托构造函数来指定:
Foo() : Foo(5) { }发布于 2012-07-19 02:50:23
括号中的(this)意味着新运算符将使用this的地址作为初始化类的地址。
这是非常危险的:您在当前对象的构造函数中,并且在相同的内存空间上调用新的构造函数。想象一下,如果你从另一个类继承会发生什么!
至于你的问题,你不能从构造函数中调用另一个重载的构造函数。典型的解决方案是有一个初始化类的方法:
class Foo
{
int _n;
public:
Foo() { init(5); }
Foo( int i) { init(i); }
void init(int i) { _n = i; }
};我在这里遇到了完全相同的问题:Yet another C++ Object initialization interrogation;请随意查看解决方案。
https://stackoverflow.com/questions/11548186
复制相似问题