关于 C++空类时编译器自动生成函数 总结
内容整理自网络!
C++的一个类中,如果没有声明下列函数,编译器会声明它自己的版本。且这些函数都是公有的。
具体编译器的做法是:只有你需要用到这些函数并且你又没有显示的声明这些函数的时候,编译器才会贴心的自动声明相应的函数。
这些函数是:一个无参缺省构造函数,一个拷贝构造函数,一个析构函数,一个赋值操作符,一个取址运算符。
无参缺省构造函数、析构函数: do nothing
取地址运算符: 只是返回对象的地址。
拷贝构造函数、赋值操作符: 对类的非静态数据成员进行“以成员为单位的”逐一拷贝。所以,定义一个重载的拷贝构造函数、赋值操作符来实现深度复制。
下面是编译器的参考实现:
Empty(); // 默认构造函数
Empty(const Empty &); // 默认拷贝构造函数
~Empty(); // 默认析构函数
Empty& operator=(const Empty &); // 赋值运算符
Empty* operator&(); // 取值运算符
const Empty* operator&() const; // 取值运算符 const
inline Empty::Empty() {}
inline Empty::~Empty() {}
inline Empty* Empty::operator&() { return this; }
inline const Empty* Empty::operator&() const { return this; }
拷贝构造函数、赋值操作符: 对类的非静态数据成员进行“以成员为单位的”逐一拷贝。
attention:
派生类的构造函数应在其初始化表里调用基类的构造函数。
基类与派生类的析构函数应该为虚(即加virtual关键字)。
编写派生类的赋值构造函数时,注意不要忘记对基类的数据成员重新赋值。
禁用编译器自动生成的函数的方法:参考http://www.cnblogs.com/xiaoxinxd/archive/2013/01/11/effective_cpp_06.html
1. 定义为private且不实现它
2. 继承Uncopyable类
3.C++0x中的新方法,在C++0x中,新添加了两个关键字:default和delete
SpecialClass(const SpecialClass&) = default;
SpecialClass& operator=(const SpecialClass&) = delete;
posted on 2013-04-15 22:09 Waaaaaall-E 阅读(267) 评论(0) 收藏 举报
浙公网安备 33010602011771号