深入理解C++构造、析构、赋值操作

C++默默编写的函数

编写一个空类Empty

class Empty {};

当经过C++处理过后,相当于你写了:

class Empty {
    Empty();      //默认构造函数
    Empty(const Empty& rhs); //复制构造函数
    Empty& operator=(const Empty& rhs); //复制赋值操作
    ~Empty();   //析构函数
}

注意上面C++自动生成的函数只有在这些函数被调用才会被编译器创建出来。

执行下面代码将产出相应的函数:

//需要注意复制构造函数与赋值操作法的区别
Empty e1;       //默认构造函数,析构函数
Empty e2(e1);   //复制构造函数
e2=e1;          //赋值操作符

为什么有了编译器为我们做的工作,还需要自己定义这些函数呢?

原因如下:

  1. 如果使用“缺省的无参数构造函数”和“缺省的析构函数”,等于放弃了自主“初始化”和“清除”的机会,默认的函数可能并不适用。
  2. 缺省的拷贝构造函数”和“缺省的赋值函数”均采用“位拷贝”而非“值拷贝”的方式来实现,倘若类中含有指针变量,这两个函数注定将出错。

例题:以下代码共调用多少次拷贝构造函数:

Widget f(Widget u)
{  
   Widget v(u);
   Widget w=v;
   return w;
}
main(){
    Widget x;         //默认构造函数被调用
    Widget y=f(f(x));
}

此题需要明白,什么时候使用复制构造函数:

1、当用类的一个对象初始化该类的另一个对象时
2、 如果函数的形参是类的对象,调用函数时,进行形参和实参结合时.
3、如果函数的返回值是类的对象,函数执行完成返回调用者时.
4、需要产生一个临时类对象时

如果按照上述的分析,应该为9次,但是这里需要注意的是编译器做了优化。return之后一定会调用拷贝构造函数,这个返回的局部变量估计是编辑器直接优化给y了,和下一次的调用形参u。所以这里少了两次。(单步调试可以看得很清楚。)因此为7次。
参考:
https://www.nowcoder.com/profile/9705898/myFollowings/detail/1327367

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值