Effective C++学习笔记 条款05:了解C++默默编写并调用的哪些函数
2024-08-26 11:32:40
一、如果用户没有提供构造函数、copy构造函数、copy assignment操作符和析构函数,当且仅当这些函数被需要的时候,编译器才会帮你创建出来。编译器生成的这些函数都是public且inline。
当你写下这样一个类的时候:
class Empty {};
如果上述的函数是被需要的话,那么编译自动会帮你把类修改为,如下:
class Empty
{
public:
Empty() {...}; //这里进行数据成员的默认初始化,如果有虚函数的话,这里还会配置好虚函数表
Empty(const Empty& rhs) {…}
~Empty() {..} //这里先对数据成员析构,然后销毁虚函数表等
Empty& operator=(const Empty& rhs) {...}
};
有待在inside c++ object model中细致考证(注:其实对于copy构造函数、赋值操作符重载,并不是你自己没有编写,当需要被调用的时候就被生成!如果编译器判断这个类的需要生成的copy构造函数等是trival,平凡的copy构造函数,那么编译器也不会生成copy'构造函数等,只会在其需要copy构造函数的或者赋值操作符重载的地方,施行逐位拷贝)。
二、注意,编译器产出的析构函数是个non-vitual,除非这个class的base class自身声明有virtual析构函数。
三、注意,在一个“内含reference成员”的class内支持赋值操作,必须自己定义copy assignment操作符。对于“内含const成员”的class,同样如此。
不然编译器会提示:
non-static reference member ‘std::string& A::m_name’, can’t use default assignment operator
或者
non-static const member ‘const string A::m_name’, can’t use default assignment operator
四、如果某个base class将copy assignment操作符声明为private,编译器将拒绝为其derived class 生成一个copy assignment操作符。
最新文章
- jvm
- MysqlWorkbench连接远程数据
- STL迭代器之二:迭代器型别
- Tomcat中间件URL中文字符传递问题
- POJ 2236 Wireless Network(并查集)
- 如何在R中加载”xlsx”包
- 数据爬取ing
- Working with Data » Getting started with ASP.NET Core and Entity Framework Core using Visual Studio » 增、查、改、删操作
- struts2视频学习笔记 11-12(动态方法调用,接收请求参数)
- RestEasy传值方式
- ios水果风暴游戏源码下载
- ContentLoadingProgressBar不显示问题
- hadoop2.2编程:MRUnit
- JS拖动浮动DIV
- .NET Mvc Razor
- HDU 1003 Max Sum【动态规划求最大子序列和详解 】
- Scala 快速入门
- notepad++ 代码注释快捷键
- 自学PYTHON分享 --基础1
- Call to undefined function think\finfo_open()