c ++特殊成员拷贝构造函数

时间:2014-09-01 16:52:46

标签: 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?
}

2 个答案:

答案 0 :(得分:0)

  

为什么这里不打印20作为隐式复制constructpr将所有成员从对象栏复制到对象foo?/

当你执行赋值时,那些成员也会重载(或内置)复制构造函数和赋值运算符:

foo=bar;

然后bar中的所有成员都被复制分配到foo中的相应字段,而intstd::string都与它们初始化的实例没有任何关系。另请注意,这里您没有调用任何copy-constuctor,而是重载赋值运算符(operator=)。

答案 1 :(得分: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;
}

这将导致包含&#34; 20&#34;的地址在复制过程中通过。现在正确设置a时,它将反映在两个对象中 这个答案附带免责声明,我不认为这是最佳做法,最后我鼓励您重新考虑您的设计。