首页 > 编程语言 >c++ 运算符重载、线程安全实现单例

c++ 运算符重载、线程安全实现单例

时间:2024-06-05 12:11:21浏览次数:20  
标签:const 对象 Pos c++ 运算符 width other 线程 Rect

一、运算符重载

namespace CalcRect
{
	struct Rect
	{
		Rect(int posX = 0, int posY = 0, int w = 0, int h = 0)
		{
			x = posX;
			y = posY;
			width = w;
			height = h;
		}
		void operator =(const Rect& other)
		{
			x = other.x;
			y = other.y;
			width = other.width;
			height = other.height;
		}

		// 重载运算符"!="
		bool operator != (const Rect& other) const
		{
			return (x != other.x || y != other.y || width != other.width || height != other.height);
		}

		// 重载运算符"=="
		bool operator == (const Rect& other) const
		{
			return (x == other.x && y == other.y && width == other.width && height == other.height);
		}

		Rect operator & (const Rect& other)
		{
			Rect tmp;
			int x1 = (std::max)(x, other.x);
			int y1 = (std::max)(y, other.y);
			tmp.width = (std::min)(x + width, other.x + other.width) - x1;
			tmp.height = (std::min)(y + height, other.y + other.height) - y1;
			tmp.x = x1;
			tmp.y = y1;
			if (tmp.width <= 0 || tmp.height <= 0)
				return Rect();
			return tmp;
		}

		int x; //!< x coordinate of the top-left corner
		int y; //!< y coordinate of the top-left corner
		int width; //!< width of the rectangle
		int height; //!< height of the rectangle
	};

	struct Point
	{
		Point(int posX, int posY)
		{
			x = posX;
			y = posY;
		}
		int x;
		int y;
	};

#define  WINDOW_MAX_COUNT 24
}  

1、运算符重载 void operator =(const Rect& other): 实现赋值操作;
bool operator == (const Rect& other) const 实现判断两个rect矩形是否相同返回bool 同时增加const 表明不会更改传入对象得状态
同时进行引用传递参数:再函数调用时传递对象得引用 而不是对象得副本
传递对象的引用和直接传递对象有一些关键区别,主要体现在以下几个方面:

对象的拷贝行为:
传递对象的引用:通过引用传递对象,不会触发对象的拷贝构造函数,函数内部直接操作的是原始对象。
直接传递对象:传递对象时,会调用对象的拷贝构造函数创建一个对象的副本,在函数内部操作的是对象的副本,而不是原始对象。
对原始对象修改的效果:
传递对象的引用:在函数内部修改对象的状态会直接反映在原始对象上,因为操作的是同一个对象。
直接传递对象:修改的是对象的副本,不会影响原始对象的状态。
性能和开销:
传递对象的引用:避免了对象的拷贝,节省了内存和时间开销。
直接传递对象:需要创建对象的副本,可能会导致性能损耗,尤其是对于大型对象或频繁调用的情况。
语义上的区别:
传递对象的引用:更明确地表示函数会直接操作原始对象,而不是对对象的副本进行操作。
直接传递对象:表达的是将对象的副本传递给函数,函数操作的是独立于原始对象的拷贝。

2.const 作用:

当const 修饰得变量,则表明变量得值是常量 ,不可被修改
当const 修饰得是成员函数 则表示该成员函数,不能改变对象的状态,同时函数内部 只能调用同样const 修饰得函数
对象的const引用: 表明函数内部 不会修改引用的对象状态
当函数得参数是常量对象得指针:应该将指针参数声明为const,这意味着函数不能通过该指针修改对象的值。这种声明方式可以确保函数内部不会意外地修改指针所指向的对象,提高程序的安全性和可靠性。

二、线程安全实现单例

class Pos
	{
	public:
		static Pos& GetInstance() {
			static Pos instance;
			return instance;
		} 
private:
    Pos() {}  // 私有构造函数,确保类外不可直接实例化
    ~Pos() {} // 私有析构函数,防止外部删除实例

    // 防止复制和赋值
    Pos(const Pos&) = delete;
    Pos& operator=(const Pos&) = delete;
}; 

通过静态局部变量 实现c++ 简单得单例,使得该对象再整个工程当中 只有一份,静态局部变量instance的线程安全初始化是由C++11标准库提供的std::call_once来保证的,确保在多线程环境下只有一个实例被创建。

Pos(const Pos&) = delete;: 这一行代码声明了一个私有的(因为默认是 private)复制构造函数,并将其定义为 delete。这样一来,当有代码企图使用复制构造函数来创建 Pos 类的对象副本时,编译器会报错,从而禁止了对象的复制。

Pos& operator=(const Pos&) = delete;: 这一行代码声明了一个私有的赋值运算符重载函数,并将其定义为 delete。这样一来,当有代码尝试使用赋值运算符来对两个 Pos类的对象进行赋值操作时,编译器会报错,禁止了对象之间的赋值。

标签:const,对象,Pos,c++,运算符,width,other,线程,Rect
From: https://www.cnblogs.com/yygou/p/18232689

相关文章

  • 【第三节】C/C++数据结构之栈与队列
    目录一、数据结构-栈1.1栈的定义1.2栈的ADT(AbstractDataType)1.3栈的顺序存储结构及实现二、数据结构-队列2.1队列的定义2.2队列的ADT2.3队列的顺序存储结构与实现2.4优先队列一、数据结构-栈1.1栈的定义栈(Stack)可以看成是一种特殊的线性表。限......
  • 计算机毕业设计项目推荐,28259校园信息交流平台的设计与实现(开题答辩+程序定制+全套文
    摘 要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,校园信息交流平台被用户普遍使用,为方便用户能够可以随时进行校园信息交流平台的数据信息管理,特开发了基于校园信息交流......
  • 计算机毕业设计项目推荐,28326 校园商店管理系统的设计与实现(开题答辩+程序定制+全套文
    摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,校园商店当然也不能排除在外。校园商店是以实际运用为开发背景,运用软件工程原理和开发方法,采用Java技术构建的一个管理系统。整个开发过程首先对软件系统......
  • (免费领源码)Java/Mysql数据库+04770 基于Java的书籍借阅管理系统设计与实现,计算机毕业
    摘 要随着科学技术的告诉发展,我们已经步入数字化、网络化的时代。图书馆是学校的文献信息中心,是为全校教学和科学研究服务的学术性机构,是学校信息化的重要基地。图书馆的工作是学校和科学研究工作的重要组成部分,是全校师生学习和研究的重要场所。为了提高图书馆的工作效率......
  • (免费领源码)Java/Mysql数据库+04827基于PHP的高校二手物品交易系统的设计与实现,计算机
    本科生毕业论文(设计) 题   目PHP高校二手物品交易系统学   院       XXXXX     专业班级   XXXXX学生姓名       XXXX    指导教师            XXXX          撰写日期:2022年5月10日目 录摘......
  • 巧用CMake编译策略:C++二次开发中的Release与Debug模式切换秘籍
    往期本博主的C++精讲优质博文可通过这篇导航进行查找:《Lemo的C++精华博文导航:进阶、精讲、设计模式文章全收录》前言在C++二次开发的过程中,理解各种编译模式并能灵活切换,对于提升软件性能和调试效率至关重要。本文将深入讨论Debug与Release模式的区别、默认编......
  • (三)Redis 线程与IO模型
    1、Redis单线程通常说Redis是单线程,主要是指Redis的网络IO和键值对读写是由一个线程来完成的,其他功能,比如持久化、异步删除、集群数据同步等,是由额外的线程执行的,所以严格来说,Redis并不是单线程。多线程开发会不可避免的带来并发控制和资源开销的问题,如果没有良好的系统......
  • C/C++ while 语句的要点与注意事项
    while 语句是C语言中的一种基本控制流语句,用于在特定条件为真时重复执行一段代码。下面是关于 while 语句的要点和注意事项的详细介绍。要点基本语法:1while(condition){2//循环体:当condition为真时执行的代码3}其中,condition 是一个表达式,其结果为......
  • 线程与进程的实现
    目录1.线程的实现方式1.用户级线程(User-LevelThreads,ULTs)2.内核级线程(Kernel-LevelThreads,KLTs)2.线程的具体实现2.1用户级线程的实现2.2内核级线程的实现3.线程的创建与终止4.进程的创建与终止5.进程同步与互斥6.进程通信总结1.线程的实现方式 ......
  • IO进程线程(五)库的制作、进程
    文章目录一、库(一)静态库1.概念2.制作3.使用(编译)(1)生成可执行文件(2)运行(二)动态库(共享库)1.概念2.制作3.生成可执行文件4.基于动态库的可执行文件的执行过程二、进程(一)概念1.进程2.进程和程序的区别3.进程的组成4.进程的种类(1)交互进程(2)批处理进程(3)守护进程5.......