运算符重载
什么是运算符重载?
对于内置的数据类型,编译器知道如何运算,但是自定义的数据类型编译器不知道如何进行运算,这时就要重载运算符来告诉编译器运算的规则。
对已有的运算符进行重新的定义,赋予其功能,以适应不同的数据类型。
要进行重载时,使用operator
来进行符号的重载。
重载函数可以是成员函数,也可以是全局函数。
运算符的重载也可以发送函数的重载。
文章源地址:修能的博客
重载加号运算符
Cuboid Cuboid::operator+(Cuboid& other)
{
Cuboid new_Cuboid = Cuboid(0, 0);
new_Cuboid.Len = this->Len + other.Len;
new_Cuboid.Wid = this->Wid + other.Wid;
return new_Cuboid;
}
Cuboid Cuboid::operator+(int addend)
{
Cuboid new_Cuboid = Cuboid(0, 0);
new_Cuboid.Len = this->Len + addend;
new_Cuboid.Wid = this->Wid + addend;
return new_Cuboid;
}
this
是加号的左值,other
是加号的右值,其本质是调用函数:
c3 = c1.operator +(c2);
重载左移运算符
一般不在成员函数中重载左移运算符,因为无法实现cout
在左侧,所以在全局函数中定义了。
std::ostream& operator<<(std::ostream& cout, Cuboid cuboid)
{
cout << cuboid.getLen() << " " << cuboid.getWid();
return cout;
}
std::ostream
是C++标准库中用于输出的基类。它定义了一些成员函数,如operator<<
,用于将数据输出到输出流中。std::ostream
是一个抽象类,不能直接实例化,但可以通过派生出的类(如std::cout
)来使用
返回std::ostream&
是为了之后能用<<
来输出别的内容(链式思想)。
重载递增运算符
前置递增
Cuboid& Cuboid::operator++()
{
this->Len++;
this->Wid++;
return *this;
}
注意是返回引用类型,否则无法对原数据的修改。
后置递增
Cuboid Cuboid::operator++(int) // 后置递增
{
//先记录当前的结果
Cuboid cur_Cuboid(*this);
this->Len++;
this->Wid;
return cur_Cuboid;
}
注意后置递增返回的是值,且为了区分前置递增,只能用int占位符
进行函数重载,编译器会解读成后置递增。
重载赋值运算符
在C++中,当我们定义一个类时,如果没有显式地重载赋值运算符(operator=
),编译器会为我们自动生成一个默认的赋值运算符。
默认的赋值运算符执行逐个成员的赋值操作,将一个对象的值复制到另一个对象中。对于简单的成员变量,这通常是有效的。但对于包含动态内存分配的成员,比如指针或动态数组,仅仅进行浅拷贝赋值是不够安全的。因为可能会导致堆区内存的重复释放,而导致程序崩溃。
因此,当类中存在动态内存分配的成员变量时,我们需要显式地重载赋值运算符来确保正确地进行对象的赋值操作。重载赋值运算符可以执行深拷贝,即逐个复制成员变量或执行其他自定义的赋值操作。
重载赋值运算符的常见形式是将成员变量从一个对象赋值给另一个对象,利用深拷贝来确保对象内存的正确复制。
Cuboid& Cuboid::operator=(const Cuboid& other)
{
// 检查自我赋值
if (this == &other) {
return *this;
}
// 释放已分配的内存
delete LenPointer;
delete WidPointer;
// 执行深拷贝
LenPointer = new int(*other.LenPointer);
WidPointer = new int(*other.WidPointer);
return *this;
}
//注意,指针对象要实例化,分配地址
//LenPointer = new int(len);
//WidPointer = new int(wid);
重载关系运算符
bool Cuboid::operator==(const Cuboid& other)
{
return (this->Len == other.Len && this->Wid == other.Wid);
}
bool Cuboid::operator!=(const Cuboid& other)
{
return !(this->operator== (other));
}
重载函数调用运算符(仿函数)
因为调用十分相似函数,得名仿函数。
void Cuboid::operator()(int len, int wid)
{//重设长宽
this->Len = len;
this->Wid = wid;
}
匿名函数对象
Cuboid()(100,100)
用之即弃的对象。