c++ - 即使由于 C++ 中的 RVO 而未调用复制构造函数,如何复制成员变量的值

标签 c++

我无法理解成员变量的值是如何被复制的,即使在下面的程序中没有调用构造函数。

#include <iostream>

using namespace std;

class myclass
{
    public:
        int x;
        int y;

        myclass(int a, int b)
        {
            cout << "In Constructor" << endl;
            x = a;
            y = b;
        }

        ~myclass()
        {
            cout << "In Destructor" << endl;
        }

        myclass(const myclass &obj)
        {
            cout << "In Copy Constuctor " << obj.x << " " << obj.y << endl;
            x = obj.x;
            y = obj.y;
        }

        myclass &operator=(const myclass &obj)
        {
            cout << "In Operator Overloading" << obj.x << obj.y << endl;
            x = obj.x;
            y = obj.y;

            return *this;
        }
};

int main()
{
    myclass obj1 = myclass(2, 3);
    cout << "obj1.x : " << obj1.x << "obj1.y" << obj1.y << endl;
}

Output:
In Constructor
obj1.x : 2obj1.y3
In Destructor

我知道由于返回值优化,复制构造函数没有被调用。但我不明白 obj1 是如何获得值 2 和 3 的。任何人都可以帮助我理解这一点或返回值优化将如何在幕后工作。

最佳答案

不会被复制,因为它们不需要被复制。相反,本应复制的值会在适当的位置进行初始化。复制省略意味着编译器本质上是这样转换的:

myclass obj1 = myclass(2, 3);

进入这个:

myclass obj1(2, 3);

因此没有构造需要复制的额外对象。

请注意,您提到的 RVO 是一种复制省略形式。但这种复制省略的具体情况不是 RVO。

关于c++ - 即使由于 C++ 中的 RVO 而未调用复制构造函数,如何复制成员变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35183760/

相关文章:

c++ - Multimap 和 shared_ptr

c++ - 二叉树插入

c++ - 为什么不能在 Boost.Test 测试用例中创建线程?

c++ - 从 const 调用非常量成员版本

c++ - 如何在端口 80 上运行 Boost.Asio 服务器?

c++ - 类型推导不适用于 std::function

c++ - OpenGL glDeleteTextures C/C++

c++ - C++ 中的 While 循环(使用 break)

c++ - 动态分配

c++ - 为什么未使用的成员模板函数的类模板实例化失败