欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > Effective C++读书笔记——item6(别动我的类)

Effective C++读书笔记——item6(别动我的类)

2025/5/24 23:41:16 来源:https://blog.csdn.net/weixin_46032775/article/details/144907577  浏览:    关键词:Effective C++读书笔记——item6(别动我的类)

防止类对象被拷贝的方法

class HomeForSale {
public:...
private:...HomeForSale(const HomeForSale&);            // declarations onlyHomeForSale& operator=(const HomeForSale&);
};
  • 私有拷贝构造函数和赋值运算符:将拷贝构造函数和拷贝赋值运算符声明为私有并不予实现,这样编译器就不会自动生成默认的拷贝构造函数和拷贝赋值运算符,从而阻止类对象被拷贝。如在HomeForSale类中,将拷贝构造函数和拷贝赋值运算符声明为私有,编译器会阻止客户的拷贝企图,若在成员或友元函数中进行拷贝操作,在连接时会出现错误。
  • class Uncopyable {
    protected:                                   // allow constructionUncopyable() {}                            // and destruction of~Uncopyable() {}                           // derived objects...private:Uncopyable(const Uncopyable&);             // ...but prevent copyingUncopyable& operator=(const Uncopyable&);
    };
  • 使用 Uncopyable 基类:创建一个Uncopyable基类,在其中将拷贝构造函数和拷贝赋值运算符声明为私有且不实现,然后让需要防止拷贝的类从Uncopyable类私有继承。这样,当试图拷贝派生类对象时,编译器生成的拷贝函数会调用基类的私有拷贝函数,从而导致编译错误,可将连接时错误提前到编译时。
  • class HomeForSale: private Uncopyable {      // class no longer...                                        // declares copy ctor or
    };                                           // copy assign. operator

相关注意事项

  • 函数参数名惯例:在声明私有拷贝构造函数和拷贝赋值运算符时,通常可以省略函数参数的名字,因为这些函数一般不会被实现和使用2。
  • Uncopyable 类的特性
    • 继承方式:从Uncopyable继承不必是公有继承,可根据具体情况选择合适的继承方式。
    • 析构函数Uncopyable的析构函数不必是虚拟的,因为其本身可能不需要作为多态基类。
    • 空基类优化由于Uncopyable不包含数据,符合空基类优化的条件,但在使用时需注意不能引入多继承,因为多继承可能会使空基类优化失效。
  • Boost 中的 noncopyable 类:Boost 提供了noncopyable类,功能与Uncopyable类似,可以使用该类来更方便地实现防止类对象被拷贝的功能。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词