Item6:如果你不想使用编译器生成函数,就明确拒绝

芝士wa
2024.3.30
Item6链接


对于一个自定义空类,编译器会自动提供四个构造函数:

  • 默认构造函数
  • 默认析构函数
  • 拷贝构造函数
  • 拷贝赋值运算符(=)

如果我不想有这些构造函数,应该怎么办呢?
书里给出了答案,自己声明这些函数,并设置为private,然后不去实现它,当有人不小心地调用了它们,在 link-time(连接时)会出现错误。
例子:

class HomeForSale {
public:
  ...

private:
  ...
  HomeForSale(const HomeForSale&);            // declarations only
  HomeForSale& operator=(const HomeForSale&);
};

此外,将连接时错误提前到编译时间也是可行的,通过写一个防止拷贝的基类,

class Uncopyable {
protected:                                   // allow construction
  Uncopyable() {}                            // and destruction of
  ~Uncopyable() {}                           // derived objects...

private:
  Uncopyable(const Uncopyable&);             // ...but prevent copying
  Uncopyable& operator=(const Uncopyable&);
};

为了阻止拷贝 HomeForSale objects(对象),我们现在必须让它从 Uncopyable 继承:

class HomeForSale: private Uncopyable {      // class no longer
  ...                                        // declares copy ctor or
};                                           // copy assign. operator

“如果有人——甚至是 member(成员)或 friend function(友元函数)——试图拷贝一个 HomeForSale objects(对象),编译器将试图生成一个 copy constructor(拷贝构造函数)和一个 copy assignment operator(拷贝赋值运算符)。就象 Item 12 解释的,这些函数的 compiler-generated versions(编译器生成版)会试图调用 base class(基类)的相应函数,而这些调用将被拒绝,因为在 base class(基类)中,拷贝操作是 private(私有)的”


总结

为了拒绝编译器自动提供的机能,将相应的 member functions(成员函数)声明为 private,而且不要给出 implementations(实现)。使用一个类似 Uncopyable 的 base class(基类)是方法之一。
更新:在C++11之后,如果一个类有析构函数,那么为其生成拷贝构造函数和拷贝赋值运算符的特性被弃用了。

posted @   芝士wa  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示