拷贝构造函数:
如果一个类的的构造函数的第一个参数是自身类型的引用,且任何额外的参数都有默认值,则此构造函数是拷贝构造函数。
#include <iostream>
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同时存在时会编译会出现二义性错误
};
拷贝构造函数不仅在我们用 = 定义的时候会调用,在下列情况下也会调用:
- 将一个对象作为实参传递给非引用类型的形参
- 从一个返回类型为非引用类型的函数返回一个对象
- 用花括号列表初始化一个数组中的元素或者一个聚合类中的成员