函数可以重载,运算符也是一种特殊的函数,因此运算符也可以重载。
函数的组成部分:
- 名称
- 输入参数
- 函数体
- 返回值
上述的每个组成部分运算符都拥有。
可以被重载的运算符:
算术运算符:+、-、*、/、%、++、--
位操作运算符:&、|、~、^(位异或)、<<(左移)、>>(右移)
逻辑运算符:!、&&、||
比较运算符:<、>、>=、<=、==、!=
赋值运算符:=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=
其他运算符:[]、()、->、,、new、delete、new[]、delete[]
不被重载的运算符:
成员运算符 .、指针运算符 *、三目运算符 ? :、sizeof、作用域 ::
友元函数运算符重载
class Integer
{
private:
int value;
public:
Integer(int value):value(value){}
int get_value() const
{
return value;
}
friend Integer operator +(const Integer& i1,const Integer& i2); // 双目
friend Integer operator ++(Integer& i); // 单目,前置
friend Integer operator ++(Integer& i,int); // 单目,后置
};
Integer operator +(const Integer& i1,
const Integer& i2)
{
return i1.value+i2.value;
}
Integer operator ++(Integer& i)
{
return ++i.value;
}
Integer operator ++(Integer& i,int)
{
return i.value++;
}
成员函数运算符重载
成员函数的运算符函数对应的输入参数比同样使用友元函数实现的友元函数的参数少一个。
class Integer
{
private:
int value;
public:
Integer(int value):value(value){}
int get_value() const
{
return value;
}
// 成员函数运算符重载
Integer operator +(const Integer& i);
Integer operator ++(); // 前置
Integer operator ++(int); // 后置
};
Integer Integer::operator +(const Integer& i)
{
// this表示运算数1
return this->value+i.value;
}
Integer Integer::operator ++()
{
return ++this->value;
}
Integer Integer::operator ++(int)
{
return this->value++;
}
其它运算符重载
赋值运算符重载
如果写一个空类,按照目前所学内容,编译器会自动添加:无参构造函数、析构函数、拷贝构造函数、赋值运算符重载函数
赋值运算符重载函数只支持成员函数运算符重载,不支持友元函数运算符重载的方式。
通常无需手动编写赋值运算符重载,以下情况需要手动编写,编译器不在自动添加赋值运算符重载函数:
- 当前类的成员变量出现指针
- 屏蔽赋值运算符的使用(权限为private)
class Teacher
{
public:
string subject;
Teacher(string sub)
{
subject = sub;
}
// 编译器自动添加赋值运算符重载函数
Teacher& operator =(const Teacher& right)
{
this->subject = right.subject;
cout << "赋值运算符:" << subject << endl;
return *this;
}
};
t2 = t1 //赋值操作
类型转换运算符重载
可以使自定义类型的对象自动转换为任意类型,此函数也只能使用成员函数运算符重载。
class Teacher
{
public:
string subject;
Teacher(string sub)
{
subject = sub;
}
//类型转换运算符重载
operator string() // 格式比较特殊
{
return subject;
}
};
注意事项
- 运算符重载限制在C++已有的运算符范围内,不允许创建新的运算符。
- 运算符重载也是函数重载,运算符也是函数。
- 重载之后的运算符不能改变优先级和结合性。
- 重载之后的运算符不能改变操作数和语法结构。
- 运算符重载不能改变该运算符用于基本数据类型的含义,但是可以把基本数据类型与自定义类型一起运算,或者都使用自定义类型。
- 运算符重载是针对新类型数据的实际需要对原有运算符的功能进行扩充,因此重载之后的功能应该与原有的功能类似,避免没有目的地使用运算符重载。
- 通常建议单目运算符使用成员函数运算符重载,双目运算符使用友元函数运算符重载。