c++ | 构造、拷贝构造、赋值、析构 | 「亲自定义private构造函数来拒绝编译器提供的default函数」

class的脊柱

包括了 一个/多个构造函数、一个析构函数、一个拷贝赋值操作符


c++编译器帮你写的默认函数

编译器会帮你声明 一个拷贝构造函数、一个析构函数、一个拷贝赋值操作符

其中,默认的拷贝构造函数是浅拷贝,由拷贝构造生成的对象里的指针会指向同一块内存;如果要避免浅拷贝可以自定义拷贝构造函数


拷贝构造与拷贝赋值是什么

它避免了值传递 pass by value,值传递的意思是将参数复制一份传到函数中,拷贝构造本身就是生成一个副本,如果它又是值传递的话会造成递归复制

拷贝构造函数用于,以同型对象初始化自我对象,所以这里有一个问题是,如果类中包含指针对象,那么调用拷贝构造的时候会把指针也复制一份,这样就会出现可能一个指针被销毁,内存也被销毁,但另一个指针还在的情况,也就是上文说的浅拷贝。

拷贝赋值运算符用于,从一个同型对象中拷贝它的值到自我对象

class Widget{
public:
    Widget();                                 // 构造函数
    Widget(const Widget& rhs);                // 拷贝构造函数
    Widget& operator=(const Widget& rhs);     // 拷贝赋值运算符
    ...    
};

Widget w1;            // 调用默认构造
Widget w2(w1);        // 调用拷贝构造
w1 = w2;              // 调用拷贝赋值运算符
Widget w3 = w2;       // 调用拷贝构造

补充点:lhs:赋值对象   rhs:赋值源    待续。。

续来了 c++ | 初始化1 | 「构造函数用成员初值列」_tuuzkiii_Tuu的博客-CSDN博客_c++成员初值列


如果不想要拷贝构造函数和拷贝赋值操作符

由于就算不声明,c++也会帮你声明这两个默认函数,因此若要彻底消灭他们——

将拷贝构造函数和拷贝赋值操作符声明为private,并且不去实现它们

class Widget{
public:
    ...
private:
    Widget(const Widget&);                // 拷贝构造函数 only声明
    Widget& operator=(const Widget& rhs); // 拷贝赋值运算符 参数可写可不写
    ...    
};

关于析构函数

1. 见此链接

2.。。待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值