【C++ Primer】拷贝构造函数
拷贝构造函数:
如果一个类的的构造函数的第一个参数是自身类型的引用,且任何额外的参数都有默认值,则此构造函数是拷贝构造函数。
include
using namespace std;
class Sale_data
{
public:
Sale_data(); // 1. 默认构造函数,自定义拷贝构造函数之后,必须自己定义构造函数
Sale_data(string boolNo); // 2. 构造函数
Sale_data(const Sale_data &); // 3. 拷贝构造函数
Sale_data(Sale_data &); //4. 拷贝构造函数
Sale_data(Sale_data &, string bookNo = "default no"); // 5. 拷贝构造函数 4和5同时存在时会编译会出现二义性错误
private:
string bookNum;
int unit_sold;
};
Sale_data::Sale_data()
{
cout << "1. Sale_data() called" << endl;
}
Sale_data::Sale_data(string bookNo)
{
cout << "2. Sale_data(string bookNo) called" << endl;
bookNum = bookNo;
}
Sale_data::Sale_data(const Sale_data& s)
{
cout << "3. Sale_data(const Sale_data& s) called" << endl;
bookNum = s.bookNum;
unit_sold = s.unit_sold;
}
Sale_data::Sale_data(Sale_data& s)
{
cout << "4. Sale_data(Sale_data& s) called" << endl;
bookNum = s.bookNum;
unit_sold = s.unit_sold;
}
Sale_data::Sale_data(Sale_data &s, string bookNo)
{
cout << "5. Sale_data(Sale_data &, string bookNo = "default no") called" << endl;
bookNum = bookNo;
unit_sold = s.unit_sold;
}
int main()
{
cout << "copy constructor demo" << endl;
const Sale_data s; // 1. Sale_data() called
Sale_data s6("bookno6"); // 2. Sale_data(string bookNo) called
Sale_data s1(s); // 3. Sale_data(const Sale_data& s) called
Sale_data s2(s6, "bookno1"); // 5. Sale_data(Sale_data &, string bookNo = "default no") called
Sale_data s3(Sale_data("bookno2")); // 2. Sale_data(string bookNo) called
Sale_data s4 = s; // 3. Sale_data(const Sale_data& s) called
//Sale_data s5 = s6; // 编译失败,4和5同时存在时会编译会出现二义性错误
};

拷贝构造函数不仅在我们用 = 定义的时候会调用,在下列情况下也会调用:
1 将一个对象作为实参传递给非引用类型的形参
2 从一个返回类型为非引用类型的函数返回一个对象
3 用花括号列表初始化一个数组中的元素或者一个聚合类中的成员
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了