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

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的正常对象吗? 。如果是这样,那么为什么在执行以下代码时未调用复制构造函数
b=a.myfunction();

上面的代码可以通过以下输出进行编译:
97
5

最佳答案

Test b;

您只是使用b的默认构造函数构造了Test对象。您所做的任何事情都不会以某种方式神奇地“重构” b。现在,您对b进行的所有操作都在已经构造好的b上完成。
b=a.myfunction();// why copy constructor not called?

不会调用拷贝构造函数,因为没有任何构造。由于您要为已经构造的对象分配内容,因此将调用对象的副本分配运算符(operator=)。

现在,如果要确保调用了复制构造函数,则应改为:
Test b = a.myfunction();



否。您已经声明bTest对象。声明对象后,您无需执行任何操作即可更改其类型。对象一旦创建就不会更改类型。

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



是。好吧,老实说,我不知道您所说的“正常物体”到底是什么意思。但是,无论您怎么说,答案肯定是肯定的。它不是引用,而且b(或C++中的其他任何内容,虽然看起来似乎如此)都没有什么神奇之处。

09-10 01:38
查看更多