【发布时间】:2015-02-14 02:17:33
【问题描述】:
如果我有以下类:
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 的值没有赋值。
那么,从方法调用构造函数是定义的操作吗?如果是这样,我的代码中缺少什么?使用调试器,我验证了构造函数实际上被调用,只是一旦流从构造函数返回= 方法,复制的值就不会保留。
【问题讨论】:
-
@dyp 不,它没有。它将创建一个名为
y的局部变量,类型为A,而不是临时变量,除非在 C++ 中在函数顶层有一个与函数参数同名的局部变量是错误的。跨度> -
@dyp - 好的,这是否意味着我不能从方法调用构造函数?
-
void operator = (const int *y) { A(y); }至少应该是A& operator = (const int *y) { A(y); return *this; }和A(y);没有意义(实际上是本地函数声明)。 -
@ysap 关于构造函数和调试器,当你中断构造函数时,确保你知道构造函数属于哪个对象。 IE。 (对于visual studio)在“watch”中输入“this”——这将显示你当前对象的地址。您将看到该构造是从您显然期望的不同对象触发的。
-
@JonathanWakely - 原因是“离题”,我看不出如何。无论如何,我在这里问过这个问题:meta.stackoverflow.com/q/280382/274579
标签: c++ class methods constructor