关于 C++空类时编译器自动生成函数 总结
2013-04-15 22:09
246 查看
内容整理自网络!
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关键字)。
编写派生类的赋值构造函数时,注意不要忘记对基类的数据成员重新赋值。
禁用编译器自动生成的函数的方法:参考/article/5417352.html
1. 定义为private且不实现它
2. 继承Uncopyable类
3.C++0x中的新方法,在C++0x中,新添加了两个关键字:default和delete
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关键字)。
编写派生类的赋值构造函数时,注意不要忘记对基类的数据成员重新赋值。
禁用编译器自动生成的函数的方法:参考/article/5417352.html
1. 定义为private且不实现它
2. 继承Uncopyable类
3.C++0x中的新方法,在C++0x中,新添加了两个关键字:default和delete
SpecialClass(const SpecialClass&) = default;
SpecialClass& operator=(const SpecialClass&) = delete;
相关文章推荐
- 编译器为C++ 空类自动生成的成员函数
- C++空类编译器自动生成的6个成员函数
- C++空类编译器自动生成的6个成员函数
- C++空类编译器自动生成的6个成员函数
- 禁用编译器自动生成的函数(Effective C++之06)
- Effective C++ 条款6 若不想使用编译器自动生成的函数,就该明确拒绝
- <Effective C++>:Item 6 :明确拒绝不想编译器自动生成的函数
- 读书笔记_Effective_C++_条款六:若不想使用编译器自动生成的函数,就该明确拒绝
- Effective C++——》条款6:若不想使用编译器自动生成函数,就该明确拒绝 .
- Effective C++ Item 6 若不想使用编译器自动生成的函数,就该明确拒绝
- [原]C++空类产生哪些成员函数 || C++类可以自动生成的6个成员函数
- C++空类产生哪些成员函数 || C++类可以自动生成的6个成员函数
- Effective C++学习笔记 条款06:如不想使用编译器自动生成的函数,就该明确拒绝
- c++定义一个空类 系统会自动生成四种函数
- Effective C++ 条款06 若不想使用编译器自动生成的函数,就该明确拒绝
- Effective C++ Item 06-若不想编译器自动生成的函数,就该明确拒绝
- c++基础---之编译器为C++ 空类自动生成的东西有哪些
- 读书笔记 effective c++ Item 6 如果你不想使用编译器自动生成的函数,你需要明确拒绝
- C++空类产生哪些成员函数 || C++类可以自动生成的6个成员函数
- Effective C++ Item 6 若不想使用编译器自动生成的函数,就该明确拒绝