深入理解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++面向对象机制(三)构造与析构
- Effective C++(二)构造、析构和赋值操作
- 深入C++之对象构造析构
- 深入探索C++对象模型之五 --- 析构、构造、拷贝语意学
- C++构造、析构的一些理解
- C++构造、析构和赋值
- [读书笔记] 深入探索C++对象模型-第五章-构造、析构、拷贝语义学(中)
- C++ 了解C++默默编写并调用哪些函数(构造 析构 拷贝构造 拷贝赋值)
- 深入理解Javascript--作用域和赋值操作
- C++我们必须要了解的事之具体做法(1)——构造、复制构造、析构、赋值操作符背后的故事
- 深入探索c++对象模型->2.2 Copy Constructor的构造操作
- 请用c++ 实现stl中的string类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能
- Effective C++ <二>:构造,析构,赋值运算
- C++对象的构造、赋值和析构
- c++超基础:继承的构造与析构(赋值兼容性原则)
- 进一步理解C++构造与析构
- 深入探索C++对象模型->2.1 Default Constructor的构造操作
- Effective C++第二章-构造,析构,赋值 -2
- Effective C++第二章-构造,析构,赋值-1
- c++ 深入理解拷贝与赋值及其他合成函数