您的位置:首页 > 编程语言 > C语言/C++

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

2017-02-24 14:09 295 查看

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;          //赋值操作符


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

原因如下:

如果使用“缺省的无参数构造函数”和“缺省的析构函数”,等于放弃了自主“初始化”和“清除”的机会,默认的函数可能并不适用。

缺省的拷贝构造函数”和“缺省的赋值函数”均采用“位拷贝”而非“值拷贝”的方式来实现,倘若类中含有指针变量,这两个函数注定将出错。

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

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++