一、运算符重载
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