如果我有以下课程:
class A {
private:
int *x;
public:
A() { x = new int; *(A::x) = 0; }
A(const int *y) { x = new int; *(A::x) = *y; }
~A() { delete x; }
void operator = (const int *y) { A(y); }
};
int main() {
A a;
int y = 3;
a = &y;
return 0;
}
我希望赋值语句调用=
方法,然后通过调用相应的构造函数来设置x
成员。但是,似乎在分配后,x
的值仍为NULL
,而y
的值未分配。
那么,从一个方法调用构造函数是一个定义的操作吗?如果是这样,我的代码中会错过什么?使用调试器我验证构造函数实际上是调用它只是一旦流从构造函数返回=
方法,复制的值就不会保留。
答案 0 :(得分:6)
没有。构造函数用于创建对象,您无法在现有对象上再次调用它们。
对象开始他们的生命一次,并结束他们的一生(最多)一次。你想要做的就像出生两次,这听起来很混乱。
答案 1 :(得分:2)
当你像你一样调用构造函数时,它被解释为一个表达式,它创建一个类A的匿名对象。这个匿名对象在创建它的语句的末尾被销毁。没有任何反应。
我建议您进行以下更改:
class A {
private:
int *x;
public:
A() { x = new int; *x = 0; } // No need of A::
A(const int *y) { x = new int; *x = *y; }
~A() { delete x; }
A& operator= (const int *y) { *x=*y; return *this; } // x was already iniatilized, so we keep it
};
但事实上,你不需要这里的指针,所以你可以进一步简化:
class A {
private:
int x;
public:
A() :x(0) { }
A(int y) : x(y) { }
~A() { }
A& operator= (const int y) { x=y; return *this; }
};
<强> 编辑: 强>
在评论中,您解释说您需要指针,并且您的意图是避免重复代码。然后我建议你另一种选择。
如上所述,您无法在operator=()
中调用构造函数。但是您可以根据标准执行相反的操作(第12.7 / 4节:成员函数,包括虚函数,可以在构造或销毁期间调用)。然后,您可以将其与委托构造函数机制结合使用:
A(const int *y) : A() { *this = y; } // calls default constructor and then uses assignment to do copy.
请注意,这里可能与普通的复制构造函数有细微的区别,例如,你有一些参考成员。