C++拷贝构造函数

拷贝(复制)构造函数是类构造函数的一种,该构造函数只有一个参数,那就是此类的引用

例如:类A创建了一个对象a1,并给它赋予特定的属性,之后程序需要创建一个和a1一样的对象,那么就可以使用

A a2(a1);

来创建相同属性的对象

如果程序员不设计类的拷贝构造函数,则编译器就会自动生成默认的拷贝构造函数,一般情况下,默认拷贝构造函数从源对象逐字节复制到目的对象

拷贝构造函数被调用的情况


  1. 使用一个对象初始化另一个对象
    具体使用实例如下:
    ​#include <iostream> using namespace std; class show{ public: int val = 10; int num = 99; }; int main() { show s; s.val = 9; s.num = 100; show sh(s); cout << sh.num << "+++" << sh.val << endl; } ​
  2. 类的对象作为参数传入函数调用
    具体使用实例如下:
    ​#include <iostream> using namespace std; class Show{ public: int val = 99; Show(){}; Show(Show & s){ cout << "这是Show的复制构造函数" << endl; } }; void FuncCopy(Show s) { cout << "This is FuncCopy" << endl; } int main() { Show s; FuncCopy(s); return 0; } ​
  3. 类的对象作为返回值被函数返回
    程序使用实例如下:
    ​#include <iostream> using namespace std; class Show{ public: int val = 99; Show(int n){ val = n; } Show(const Show & s){ val = 11; cout << "This is copyBuildFunc" << endl; } }; Show s(66); Show FuncCopy() { cout << "This is FuncCopy" << endl; return s; } int main() { cout << FuncCopy().val << endl; return 0; } ​​由于许多编译器会对程序进行优化以提高程序运行效率,因此函数返回值对象就不再使用复制构造函数,如果对象s不是全局变量,则不会调用复制构造函数