首页 > 其他分享 >Item6:如果你不想使用编译器生成函数,就明确拒绝

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

时间:2024-03-30 15:11:42浏览次数:24  
标签:HomeForSale 函数 Item6 private Uncopyable 编译器 拷贝 class

芝士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(基类)是方法之一。

标签:HomeForSale,函数,Item6,private,Uncopyable,编译器,拷贝,class
From: https://www.cnblogs.com/cheese-wa/p/18105513

相关文章

  • sort函数对vector一维或者二维数组排序
    目录sort对一维数组排序1、sort对一位数组升序排序2、sort对一维数组降序排序sort对二维数组排序1、sort默认对横坐标进行升序排序,如下:2、使用自定义排序对纵坐标进行升序排序:额外知识:对横坐标进行降序排列,当横坐标相同时,对纵坐标进行升序排序sort对一维数组排序......
  • __cxa_pure_virtual报错(g++编译虚函数时)
    g++编译os的memory'时不知道为什么报错。尝试了很多方法(也可能搜错了)可以确定是纯虚函数出现了问题 复习一下虚函数的子类构造和析构的过程吧(一年过去了)允许派生类调用父类的同名函数而实现不同的功能,也叫动态联编。底层原理:虚函数表+虚函数表指针。每一个类都会对应一个......
  • C语言rand、srand库函数生成随机数(附时间戳)
    前言:当我们想要用C语言写程序来获取一个随机数时,该如何获取呢?这里我们上百度搜索一下这里就有提到使用rand、srand、time库函数搭配来获取随机数,也许根据其所说我们已经可以获得随机数解决问题,但想问题不能只浮于表面,下面我们来深入认识一下rand、srand、time库函数。一、ra......
  • 函数调用约定——__cdecl与__stdcall
    1.定义函数调用约定,也称函数调用协议,是指在函数调用时,确定函数参数如何传递给被调用的函数,以及如何返回结果值给调用者的一系列规则。也就是函数的调用者与被调用者之间如何传参以及如何恢复栈平衡。2.职责规定了函数参数的压栈顺序,即有多个参数时,按照什么顺序进行压栈;规定了......
  • openGauss 函数及存储过程支持
    函数及存储过程支持可获得性本特性自openGauss1.1.0版本开始引入。特性简介函数和存储过程是数据库中的一种重要对象,主要功能将用户特定功能的SQL语句集进行封装,并方便调用。客户价值允许客户模块化程序设计,对SQL语句集进行封装,调用方便。存储过程会进行编译缓存,可以提升......
  • openGauss 高级分析函数支持
    高级分析函数支持可获得性本特性自openGauss1.1.0版本开始引入。特性简介无。客户价值我们提供窗口函数来进行数据高级分析处理。窗口函数将一个表中的数据进行预先分组,每一行属于一个特定的组,然后在这个组上进行一系列的关联分析计算。这样可以挖掘出每一个元组在这个集合......
  • R语言paste函数、paste0函数将多个输入组合成字符串实战
    R语言paste函数、paste0函数将多个输入组合成字符串实战目录R语言paste函数、paste0函数将多个输入组合成字符串实战#基本语法......
  • R语言dplyr包near函数查看向量对应元素是否相同或者相近实战
    R语言dplyr包near函数查看向量对应元素是否相同或者相近实战目录R语言dplyr包near函数查看向量对应元素是否相同或者相近实战#......
  • mysql 日期时间函数
        学习了字符串函数,接着学习日期时间函数,3,日期和时间函数        日期和时间函数主要用来处理日期和时间值,一般的日期函数除了使用DATE类型的参数外,也可以使用DATETIME或者TIMESTAMP类型的参数,但会忽略这些值的时间部分。相同的,以TIME类型值为参数的函数,......
  • js简单实现函数重载
    函数重载在前端开发中,JavaScript并不支持像其他语言(如C++或Java)中那样的函数重载,其中可以根据参数的不同来调用不同的函数。在JavaScript中,函数名是唯一的标识符,而不是函数签名。因此,定义具有相同名称但不同参数数量或类型的多个函数将会覆盖前面的定义。但是,你可......