首页 > 其他分享 >禁止拷贝构造函数和赋值操作符

禁止拷贝构造函数和赋值操作符

时间:2024-10-15 23:14:49浏览次数:1  
标签:const GlobalSettings 操作符 拷贝 构造函数 赋值

 

GlobalSettings(const GlobalSettings&) = delete;
GlobalSettings& operator=(const GlobalSettings&) = delete;

这两行代码是为了禁止拷贝构造函数赋值操作符,也就是说,GlobalSettings 类的对象无法通过拷贝赋值来创建或修改。这是为了防止类的实例被复制,通常用于实现单例模式或其他需要保证唯一实例的场景。

让我们详细解释一下:

1. GlobalSettings(const GlobalSettings&) = delete;

  • 作用:删除默认的拷贝构造函数。

  • 拷贝构造函数:如果没有显式定义,编译器会自动生成一个拷贝构造函数,其作用是通过现有对象来创建一个新对象。它的签名通常是 ClassName(const ClassName&),其中 const ClassName& 是一个对已有对象的引用。

    例如:

    GlobalSettings gs1;
    GlobalSettings gs2(gs1);  // 这将调用拷贝构造函数
    

    通过 delete 关键字,你显式地告诉编译器删除这个拷贝构造函数,这意味着对象不能通过拷贝来构造。尝试复制对象会导致编译错误。

  • 用途:禁止拷贝构造函数可以防止类对象被拷贝。例如,在实现单例模式时,您希望只存在一个全局对象,因此需要防止通过拷贝来创建额外的实例。

2. GlobalSettings& operator=(const GlobalSettings&) = delete;

  • 作用:删除赋值操作符。

  • 赋值操作符:默认的赋值操作符允许将一个对象赋值给另一个对象,签名通常是 ClassName& operator=(const ClassName&),并返回一个对该类对象的引用。

    例如:

    GlobalSettings gs1;
    GlobalSettings gs2;
    gs2 = gs1;  // 这将调用赋值操作符
    

    通过 delete 关键字,你显式地禁止使用赋值操作符,因此尝试将一个对象赋值给另一个对象将导致编译错误。

  • 用途:通过删除赋值操作符,可以确保对象之间不能通过赋值进行拷贝或替换。这对保护对象的唯一性很重要,尤其是在类中包含需要特殊管理的资源(如文件句柄、线程、内存等)时。

总结:

这两行代码的意思是,GlobalSettings 类的对象不能被拷贝或通过赋值进行修改。它通常用于防止在程序中产生多个实例,比如在单例模式中,确保类只有一个全局实例。

示例应用场景:单例模式

在单例模式中,您通常希望一个类只能有一个实例,并且该实例不能被复制或重新赋值。这时候可以删除拷贝构造函数和赋值操作符:

class GlobalSettings {
public:
    static GlobalSettings& getInstance() {
        static GlobalSettings instance;  // 唯一的实例
        return instance;
    }

    // 禁止拷贝构造和赋值操作
    GlobalSettings(const GlobalSettings&) = delete;
    GlobalSettings& operator=(const GlobalSettings&) = delete;

private:
    GlobalSettings() {}  // 私有构造函数,防止直接实例化
};
  • 通过这种方式,您只能通过 getInstance() 来获取 GlobalSettings 的唯一实例。
  • 任何尝试通过拷贝或赋值来创建或修改 GlobalSettings 对象都会导致编译错误。
 

标签:const,GlobalSettings,操作符,拷贝,构造函数,赋值
From: https://www.cnblogs.com/chentiao/p/18468735

相关文章

  • vue3使用pinia仓库解构赋值响应式丢失的解决方式
    代码storeimport{defineStore}from"pinia";import{ref}from"vue";exportconstuseMyTestStore=defineStore('mytestStore',()=>{//stateconstcount=ref(0);constcount2=ref(1);constincrement2......
  • union all SQL 操作符
    在Hive中,`UNIONALL`是一个SQL操作符,用于将两个或多个查询的结果合并为一个结果集。与`UNION`不同,`UNIONALL`不会自动去重,因此它会返回所有查询结果,包括重复的记录。以下是`UNIONALL`在Hive中的一些主要作用和特点: 主要作用1.合并结果集:  可以将多个S......
  • 操作符详解
    ⽬录1.操作符的分类2.⼆进制和进制转换3.原码、反码、补码4.移位操作符5.位操作符:&、|、^、~6.单⽬操作符7.逗号表达式8.下标访问[]、函数调⽤()9.结构成员访问操作符10.操作符的属性:优先级、结合性11.表达式求值1.操作符的分类•算术操作符:+、......
  • JavaScript进阶笔记--深入对象-内置构造函数及案例
    深入对象创建对象三种方式利用对象字面量newObject({…})利用构造函数//1.字面量创建对象constobj1={name:'pig',age:18};console.log(obj1);//{name:"pig",age:18}//2.构造函数创建对象functionPig(name,age){......
  • 对象赋值给变量
    问题:变量a和对象b。直接使变量a=b,改变a的值会使对象b本身跟着改变。原因:变量a得到的是对象b的地址,a和b指向内存堆中同一个对象。解决:        ①:解构对象b再赋值给变量a                 a={...b}        ②:JSON序列化     ......
  • 换位操作符详解
    下面是一些简单的换位代码和解释     那么代码就分享到这里,谢谢大家! ......
  • Java如何写一个构造函数
     构造函数是类的一个特殊成员函数,它在创建对象时被调用,用于初始化新创建的对象。在Java中,构造函数的名称必须与类名完全相同,没有返回类型(包括void)。构造函数可以有参数,也可以没有。Java中的构造函数示例假设我们想要创建一个Person类,包含name和age两个属性。我们可以这样定......
  • Java如何调用构造函数和方法以及使用
    调用构造函数的格式构造函数在创建新对象时被调用。调用格式如下:ClassNameobjectName=newClassName(parameters);ClassName:你需要创建其实例的类的名称。objectName:你将创建的对象的名称。parameters:如果你使用的是带有参数的构造函数,这里需要传递相应的参数。示例:......
  • 5.3 C#数组的基本操作与排序(数组赋值、最大最小值、冒泡排序、选择排序、Array类排序)
    文章目录5.3.1C#数组对象的赋值例5-5:通过循环给一维数组赋值例5-6:通过键盘输入给数组赋值5.3.2C#数组对象的输出例5-7:不同类型数组的输出5.3.3C#求数组中的最大(小)元素值例5-8:求数组中的最大值和最小值5.3.4C#数组排序1.使用Array类排序(例5-9)2.冒泡排序(例5-......
  • 【C++】类和对象(3)(默认成员函数--拷贝构造&赋值重载)
    引言前文介绍了C++中默认成员函数中的构造函数和析构函数,相信已经对它们的功能与用法有了基本认识,本文接着介绍也很常见的拷贝构造函数和赋值重载函数,便于对C++进一步的学习。拷贝构造函数补充知识:深浅拷贝深拷贝和浅拷贝是C++中对象拷贝的两种不同方式。浅拷贝是指将......