我在C ++中有两个构造函数,一个构造函数调用另一个构造函数以便不复制初始化逻辑。
#include <iostream>
#include <memory>
using namespace std;
class A
{
int x;
int y;
public:
A(int x)
{
cout << this << endl;
this->x = x;
}
A()
{
cout << this << endl;
A(20);
}
...
};
有趣的是A()调用A(int),但是this指针指向不同的地址。为什么是这样?或者是这个g ++错误?
int main(int argc, char *argv[]) {
A* a = new A();
}
0x7fa8dbc009d0 <-- from A()
0x7fff67d660d0 <-- from A(int)
答案 0 :(得分:5)
我相信A(20);
正在构造函数中构造一个不同的A实例,而不是在同一个实例上调用其他构造函数。
请参阅Can I call a constructor from another constructor (do constructor chaining) in C++?,了解如何从构造函数中调用另一个构造函数。
如果您使用的是支持C ++ 11的编译器,我认为您可以通过A()
构造函数的这个定义实现您想要的目标:
A(): A(20)
{
cout << this << endl;
}
答案 1 :(得分:1)
A(20);
是一个构造A
的新实例的语句,而不是A
上对this
的构造函数的调用。
您不能在C ++ 03中的给定构造函数内调用另一个构造函数重载。但是,您可以使用placement new来实现相同的效果。替换:
A(20);
代码中的
:
new (this) A(20);