Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;类对象的引用返回为什么不调用复制构造函数?_C++ - Fatal编程技术网

C++ C++;类对象的引用返回为什么不调用复制构造函数?

C++ C++;类对象的引用返回为什么不调用复制构造函数?,c++,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<<"consructo

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

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;
}
如果是这样的话,那么当'm'的值在

m.data=5;  
2) b是正常对象吗?。如果是这样,那么为什么在执行以下代码时不调用复制构造函数

b=a.myfunction();
上述代码可以通过以下输出进行编译:
97
五,

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

b=a.myfunction();// why copy constructor not called?
未调用复制构造函数,因为未构造任何内容。由于要将某些内容分配给已构造的对象,因此将调用该对象的复制分配操作符(
操作符=

现在,如果要确保调用复制构造函数,则应执行以下操作:

Test b = a.myfunction();

is'b'成为'm'的参考

否。您已将
b
声明为
Test
对象。一旦一个对象被声明,您所做的任何事情都不会改变它的类型。对象创建后不会更改类型

由于
myfunction()
返回一个引用,
b
的赋值运算符将其用作右侧。它没有将
b
作为引用——它只是从
myfunction()
返回的东西中复制东西,而这恰好是对其他东西的引用

b是普通物体吗


对。老实说,我不知道你说的“普通物体”到底是什么意思,但不管你是什么意思,答案肯定是肯定的。它不是一个引用,并且没有关于<代码> B<代码>的任何魔法(或者C++中的任何东西,虽然看起来是这样)。

对象B已经在上面的行中构建了,所以它不会调用复制构造函数,而是赋值操作符。

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

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

b
不是参考。作为引用的返回类型不会改变这一事实。1)正如chris所说,
b
不是引用2)在
b
上调用
Test
的复制赋值操作符(它与复制构造函数不同)@chris如果“b”不是对“m”的引用,因此是一个普通对象,那么为什么不调用复制构造函数?@user3249833:因为
b
已经被构造。请看我的答案。@john Dibling是否有任何方法可以通过Myfunction返回引用并将其分配给“b”?为什么下面的代码不起作用
Test Test::Myfunction(){return m;}
我想返回一个Test objectwhy下面的代码不起作用
Test Test::myfunction(){return m;}我想返回一个测试object@user3249833具体点。你期望它做什么?实际上我想通过'Myfunction'返回一个引用,并将其分配给'b'。(因此b变成了对m的引用)有什么办法吗。。?
Test b = a.myfunction();
// Using copy constructor:
Test a;
Test b = a.myfunction();

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