企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
## 条款06:若不想使用编译器自动生成的函数,就该明确拒绝 Explicitly disallow the use of compiler-generated functions you do not what. 编译器产出的函数都是 public,如果想阻止这些函数被创建出来,并且没什么需求使用,可以将将它们声明为 private。即明确声明一个成员函数,阻止了编译器暗自创建其专属版本;而令这些函数为 private,使得客户无法调用它。 不过这个做法并不绝对安全,因为 member 函数和 friend 函数还是可以调用 private 函数。但是可以选择不去定义它们,这样如果不慎调用它们,会获得一个连接错误(linkage error)。即将成员函数声明为 private 而且故意不实现它们。 ```cpp class HomeForSale { public: ... private: ... HomeForSale(const HomeForSale&); HomeForSale& operator=(const HomeForSale&); }; ``` 这里并不需要写函数参数名称,因为这些函数没有被实现,并且不会被调用。 如果想令许多类不能被复制,可以专门为阻止 copying 动作而设计一个 base class: ```cpp class Uncopyable { protected: Uncopyable() {} ~Uncopyable() {} private: Uncopyable(const Uncopyable&); Uncopyable& operator=(const Uncopyable&); }; class HomeForSale: private Uncopyable { // class 不用再声明 copy 构造函数 或 copy assign 操作符 ... }; ``` 编译器构造的默认函数会尝试调用其 base class 的对应函数,但这些调用会被编译器拒绝,因为 base class 的拷贝函数是 private 的。