【C++ Primer】拷贝构造函数

拷贝构造函数:

如果一个类的的构造函数的第一个参数是自身类型的引用,且任何额外的参数都有默认值,则此构造函数是拷贝构造函数。

#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同时存在时会编译会出现二义性错误
};

拷贝构造函数不仅在我们用 = 定义的时候会调用,在下列情况下也会调用:

  1. 将一个对象作为实参传递给非引用类型的形参
  2. 从一个返回类型为非引用类型的函数返回一个对象
  3. 用花括号列表初始化一个数组中的元素或者一个聚合类中的成员
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值