C ++引用返回类对象 - 为什么没有调用复制构造函数?

时间:2014-01-29 17:58:42

标签: c++

考虑以下代码处理引用返回:

class Test  
{  
    public:  
    int data;

    Test() { data = 0; }
    Test(int u) { data = u;}

    Test& myfunction ();// function returning reference
    Test(Test& b) // copy constructor
    {
    cout<<"consructor called";
    }

    void print() { cout << data<<endl; }
};  
Test m(97);
Test& Test:: myfunction ()
{
    return m;
};    

int main()
{   Test a;
    Test b;
    b=a.myfunction();// why copy constructor not called?

    b.print();
    m.data=5;
    b.print();// if b is a reference of m then why its value not changed?

    return 0;
}

我有两个问题 1)'b'通过以下内容成为'm'的引用:

    b=a.myfunction();

如果是,那么为什么在

中改变'm'的值时它的值不会改变
m.data=5;  

2)是普通对象吗?。若是,那么为什么在执行以下代码时不会调用复制构造函数

b=a.myfunction();

上面的代码用以下输出编译好:
97个
5

2 个答案:

答案 0 :(得分:2)

Test b;

您刚刚使用b的默认构造函数构造了Test对象。你所做的一切都不会以某种方式神奇地“重建”b。您现在使用b执行的所有操作都已在已构建的b上完成。

b=a.myfunction();// why copy constructor not called?

未调用复制构造函数,因为没有构造任何内容。由于您正在为已构造的对象分配内容,因此将调用该对象的副本赋值运算符(operator=)。

现在,如果您想要以确保调用复制构造函数,那么您应该这样做:

Test b = a.myfunction();

  

是'b'成为'm'的引用

没有。您已将b声明为Test个对象。一旦声明了一个对象,你所做的一切都不会改变它的类型。对象在创建后不会更改类型。

由于myfunction()返回引用,b的赋值运算符将其用作右侧。它不会使b成为引用 - 它只是复制myfunction()返回的东西中的东西,这恰好是对其他内容的引用。

  

是普通对象吗?

是。好吧,如果我是诚实的,我不知道你的意思是什么“正常对象”。但无论你的意思是什么,答案肯定是肯定的。这不是一个参考,并且b(或者C ++中的任何其他东西,但它看起来都是如此)没有任何魔力。

答案 1 :(得分:0)

对象b已在上面的行中构造,因此它不会调用复制构造函数,而是调用赋值运算符。

// Using copy constructor:
Test a;
Test b = a.myfunction();

// Using assignment operator
Test c;
c = a.myfunction();