条款06:若不想使用编译器自动生成的函数,就该明确拒绝
2012-02-09 22:53
387 查看
所有编译器产生出来的函数都是public。为了阻止编译器自动声明赋值操作符和赋值构造函数,可以声明这些函数为private。藉由明确声明一个成员函数,你阻止了编译器暗自创建其专属版本。令这些函数为private阻止别人调用它。
这个做法并不绝对安全,因为成员函数和friend函数还是可以调用你的private函数。
如果有人不慎调用了任何一个,会获得一个连接次错误(linkage error),“将成员函数声明为private而且故意不实现它们”
将连接期错误移至编译期是可能的,只要将copy构造函数和赋值操作符声明为private,不是自身,而是在基类中:
为了驳回编译器自动提供的机能,可将相应的成员函数声明额外private并且不予实现,使用想Uncopyable这样的基类也是一种做法。
class HomeForSale { public: ... private: ... HomeForSale(const HomeForSale&); //只有声明 HomeForSale& operator=(const HomeForSale&); };
这个做法并不绝对安全,因为成员函数和friend函数还是可以调用你的private函数。
如果有人不慎调用了任何一个,会获得一个连接次错误(linkage error),“将成员函数声明为private而且故意不实现它们”
将连接期错误移至编译期是可能的,只要将copy构造函数和赋值操作符声明为private,不是自身,而是在基类中:
class Uncopyable { protected: Uncopyable(){} ~Uncopyable(){} private: Uncopyable(const Uncopyable&); Uncopyable& operator=(const Uncopyable&); }; //为了阻止HomeForSale对象被拷贝,我们唯一需要做的就是继承Uncopyable: class HomeForSale:private Uncopyable { ... };
为了驳回编译器自动提供的机能,可将相应的成员函数声明额外private并且不予实现,使用想Uncopyable这样的基类也是一种做法。
相关文章推荐
- 条款06:若不想使用编译器自动生成的函数,就该明确拒绝
- [Effective C++读书笔记]006_条款06_若不想使用编译器自动生成的函数,就该明确拒绝
- 条款06:若不想使用编译器自动生成的函数,就该明确拒绝
- 《Effect C++》学习------条款06:若不想使用编译器自动生成的函数,就该明确拒绝
- 条款06:若不想使用编译器自动生成的函数,就该明确拒绝
- Effective C++ 条款06 若不想使用编译器自动生成的函数,就该明确拒绝
- Effective C++ 条款06:若不想使用编译器自动生成的函数,就该明确拒绝
- 条款06 若不想使用编译器自动生成的函数 就该明确拒绝
- 条款06:若不想使用编译器自动生成的函数,就该明确拒绝
- Effective C++ -----条款06:若不想使用编译器自动生成的函数,就该明确拒绝
- 条款06:若不想使用编译器自动生成的函数,就该明确拒绝
- Effective C++ 条款06 若不想使用编译器自动生成的函数,就该明确拒绝
- 条款06: 若不想使用编译器自动生成的函数,就该明确拒绝
- Effective C++:条款06:若不想使用编译器自动生成的函数,就该明确拒绝。
- 条款06:若不想使用编译器自动生成的函数,就该明确拒绝.
- Effective C++学习笔记 条款06:如不想使用编译器自动生成的函数,就该明确拒绝
- 条款06:若不想使用编译器自动生成的函数,就该明确拒绝
- Effective C++_笔记_条款06_若不想使用编译器自动生成的函数,就该明确拒绝
- 条款06:若不想使用编译器自动生成的函数,就该明确拒绝(Explicitly disallow the use of compiler-generated you do not want.)
- [Effective C++]条款06 若不想使用编译器自动生成的函数,就该明确拒绝