Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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++_Constructor_Initialization_Copy Constructor - Fatal编程技术网

C++ 使用另一个(现有)对象创建新对象时会发生什么情况?

C++ 使用另一个(现有)对象创建新对象时会发生什么情况?,c++,constructor,initialization,copy-constructor,C++,Constructor,Initialization,Copy Constructor,我读过一本书,上面写着: 当我们使用另一个初始化一个新创建的对象时-使用复制构造函数创建一个临时对象,然后使用赋值操作符将值复制到新对象 后来我在书中读到: 当使用另一个对象初始化新对象时,编译器会创建一个临时对象,并使用复制构造函数将其复制到新对象。临时对象作为参数传递给复制构造函数 真的很困惑,到底发生了什么 我认为这两条语句都不正确-不调用复制赋值运算符 我将把发生的情况描述为: 当您创建一个新对象作为现有对象的副本时,将调用复制构造函数: // creation of new objec

我读过一本书,上面写着: 当我们使用另一个初始化一个新创建的对象时-使用复制构造函数创建一个临时对象,然后使用赋值操作符将值复制到新对象

后来我在书中读到: 当使用另一个对象初始化新对象时,编译器会创建一个临时对象,并使用复制构造函数将其复制到新对象。临时对象作为参数传递给复制构造函数


真的很困惑,到底发生了什么

我认为这两条语句都不正确-不调用复制赋值运算符

我将把发生的情况描述为:

当您创建一个新对象作为现有对象的副本时,将调用复制构造函数:

// creation of new objects
Test t2(t1);
Test t3 = t1;
只有当指定给已存在的对象时,才会调用复制指定操作符

// assign to already existing variable
Test t4;
t4 = t1;
我们可以用以下小例子来证明这一点:

#include <iostream>

class Test
{
public:
    Test() = default;
    Test(const Test &t)
    {
        std::cout << "copy constructor\n";
    }
    Test& operator= (const Test &t)
    {
        std::cout << "copy assignment operator\n";
       return *this;
    }
};

int main()
{
    Test t1;

    // both of these will only call the copy constructor
    Test t2(t1);
    Test t3 = t1;

    // only when assigning to an already existing variable is the copy-assignment operator called
    Test t4;
    t4 = t1;

    // prevent unused variable warnings
    (void)t2;
    (void)t3;
    (void)t4;

    return 0;
}

继续阅读,稍后再回到这一点,确保您能理解;)@第一步不,第一句话听起来不对。第二种可能是正确的。“暂时的”可能永远不会发生。@Juan I的可能复制品没有说哪个是正确的。但两者都在陈述相同的信息。。我可能是唯一一个看到两个人都一样的人,他们听起来都不对。我不明白为什么在用同一类型的另一个对象复制构建一个对象时会创建临时对象。我也看不出第一个例子中的作业是从哪里来的。好的,谢谢你的例子。我理解这一点,但上面的语句让我困惑,如果复制构造函数和重载赋值运算符都在从现有对象初始化对象时使用。@我认为您提到的语句是不正确的。你在哪本书中找到的?
copy constructor
copy constructor
copy assignment operator