2014-09-01 61 views
-2

我已经理解了拷贝构造函数的概念,我们使指针具有不同的位置并指向相同的值。C++特殊成员拷贝构造函数

但我想知道为什么当我尝试访问一个对象的变量的值时,它的值不同于另一个的值。

例如:

#include <iostream.h> 
using namespace std; 

class myclass { 
public: 
    int a, b; 
    string c; 
}; 

int main() 
{ 
    myclass foo, bar; 
    foo = bar; 
    bar.a = 20; 
    cout << foo.a << endl; // why it is not printing 20 here, as implicit copy 
          // constructor copy all members from object bar 
          // to object foo? 
} 
+1

因为您在设置该成员之前进行了复制。 – Till 2014-09-01 16:53:50

+7

*“我已经理解了复制构造函数的概念”*,不,你没有:( – 2014-09-01 16:54:00

+2

当你有指针时,你只会指向指向同一个对象的指针,这里没有指针,只有两个独立的对象。更改一个对象不会改变另一个对象 – 2014-09-01 16:58:39

回答

0

复制构造函数未将参考或指针a传递给新对象,它正在复制此原始整数的值。为了达到你想要的效果(你假设我的假设是在复制对象后指定a的值),你应该重构你的类,让a指针为一个整数。考虑以下示例:

class myclass 
{ 
    int *a, *b; 
    string c; 
    myclass() 
    { 
     a = new int; 
     b = new int; 
    } 
}; 

int main() 
{ 
    myclass foo, bar; 
    foo = bar; 
    *bar.a = 20; 
    cout << foo.a << endl; 
} 

这将导致在复制构建过程中将传递包含“20”的地址。现在,当a设置正确时,它将反映在两个对象中。
答案随附免责声明,我不认为这是最佳实践,最终我鼓励您重新考虑您的设计。

0

为什么在这里不打印20个隐式副本constructpr将复制的对象吧所有成员对象foo/

那些成员有拷贝构造函数和分配操作员过载(或内置)时,当你做任务:

foo=bar; 

那么bar的所有成员都会被复制分配给foo中的相应字段,并且intstd::string都不会与其初始化的实例有任何关系。另外请注意,在这里你并没有调用任何复制构造函数,而是调用了重载赋值操作符(operator=)。