c++ - 在哪些情况下调用 C++ 复制构造函数?

标签 c++ visual-c++ constructor copy-constructor

我知道在 c++ 中会调用复制构造函数的以下情况:

  1. 当一个现有的对象被分配一个它自己的类的对象时

    MyClass A,B;
    A = new MyClass();
    B=A; //copy constructor called 
    
  2. 如果函数接收作为参数,按值传递的类的对象

    void foo(MyClass a);
    foo(a); //copy constructor invoked
    
  3. 当函数返回(按值)类的对象时

    MyClass foo ()
       {
          MyClass temp;
          ....
          return temp; //copy constructor called
       } 
    

请随时纠正我所犯的任何错误;但是我更好奇是否还有其他调用复制构造函数的情况。

最佳答案

When an existing object is assigned an object of it own class

    B = A;

不一定。这种赋值称为copy-assignment,意思是调用类的赋值运算符对所有数据成员进行成员赋值。实际函数是 MyClass& operator=(MyClass const&)

此处不调用复制构造函数。这是因为赋值运算符引用了它的对象,因此不执行复制构造。

复制分配不同于复制初始化,因为复制初始化仅在对象被初始化时进行。例如:

T y = x;
  x = y;

第一个表达式通过复制 x 来初始化 y。它调用复制构造函数 MyClass(MyClass const&)

如前所述,x = y 是对赋值运算符的调用。

(还有一个叫做 copy-elison 的东西,编译器会省略对复制构造函数的调用。你的编译器很可能会使用它)。


If a functions receives as argument, passed by value, an object of a class

    void foo(MyClass a);
    foo(a);

这是正确的。但是,请注意,在 C++11 中,如果 a 是一个 xvalue,并且如果 MyClass 具有适当的构造函数 MyClass(MyClass&&), 一个可以是moved进入参数。

(copy-constructor和move-constructor是类的两个默认编译器生成的成员函数。如果你自己不提供,编译器会在特定情况下慷慨地为你提供) .


When a function returns (by value) an object of the class

    MyClass foo ()
    {
        MyClass temp;
        ....
        return temp; // copy constructor called
    }

通过 return-value optimization ,正如一些答案中提到的,编译器可以删除对复制构造函数的调用。通过使用编译器选项 -fno-elide-constructors ,您可以禁用复制 elison 并查看在这些情况下确实会调用复制构造函数。

关于c++ - 在哪些情况下调用 C++ 复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21206359/

相关文章:

c++ - 我们在哪里可以使用 std::barrier 而不是 std::latch?

c++ - 为什么我的 C++ 到十六进制转换会导致不同的格式?

c++ - 在 IBM Rhapsody 中查找事件类销毁何时完成

C++ std::nextbefore 函数?

c++ - 用于流格式化的 ios 和 ios_base 类

java - Android 对话框中的默认构造函数

c++ - 什么时候在构造函数中调用虚函数是安全的

C++ 链表 - 使用哨兵从文件中读取数据

c++ - 计算一个十六进制数的位数

Java:为什么有人会在默认情况下编写 super() ?