目录
概述
- 在c++中你自定义一个类,如果不重载对应的运算符,类对象之间是不能使用加、减等运算符号的,必须重载+运算符,类对象之间才可以进行加运算。
- c++的运算符重载有类内重载和类外重载。
- 使用类外重载,如果成员变量是私有的,必须加友元。一般类外重载比较形象。
知识点
一、单目运算符:运算所需变量为一个的运算符叫单目运算符,又叫一元运算符。在c语言里主要包括:
- 逻辑非运算符【!】
- 按位取反运算符【~】
- 自增自减运算符【++,–】
- 负号运算符【-】
- 类型转换运算符【(类型)】
- 指针运算符和取地址运算符【*,&】
- 长度运算符【sizeof】
二、单目运算符的限制:在全局函数中代入一个参数,就是该类的对象的引用。
- 参数只有1个,就是该类对象的引用,不需要改变对象自身的可以带const做保护。
- 如果此种计算要改变类对象本身,就不能加const。
- 返回值如果是返回传入的类对象自身,一般可以用该类的引用。
- 返回值如果是返回一个临时对象,则必须不能用引用变量,必须返回一个对象。
三、双目运算符:运算所需要变量为两个的运算符叫做双目运算符
例如:+,-,*,/,%,<,>,<=,>=,==,!=,<<,>>,&,&&,^,|,||,=
使用2个参数,运算符左边对象是第一个参数,运算符右边是传入的参数(一般用引用)
四、不允许重载的运算符只有5个:
- 成员访问运算符【.】
- 成员指针访问运算符【.*】
- 域运算符【::】
- 长度运算符【sizeof】
- 条件运算符【?:】
五、必须在类内重载的运算符:(),[],->,和赋值运算符=。
自定义类
这里我们自定义一个类,后面运算符的重载都是对该类的重载。
class CNumber
{
public:
explicit CNumber(int nNum):m_nNumber(nNum)
{}
void Show() const {
std::cout << m_nNumber << std::endl;
}
private:
int m_nNumber;
};
重载 小于 运算符
//类内重载
public:
bool operator<(const CNumber& obj) const
{
return m_nNumber < obj.m_nNumber;
}
//类内定义友元函数
friend bool operator<(const CNumber& obj1, const CNumber& obj2);
//类外重载
bool operator<(const CNumber& obj1, const CNumber& obj2)
{
return obj1.m_nNumber < obj2.m_nNumber;
}
int main()
{
CNumber num1(1);
CNumber num2(2);
bool bRt = num1 < num2;
std::cout << bRt << std::endl;//1
return 0;
}
重载 加号 运算符
- 双目运算符,类内类外都可以重载。
//类内重载
public:
CNumber operator+(const CNumber& obj)
{
int nNewNumber = this->m_nNumber + obj.m_nNumber;
CNumber objNew(nNewNumber);
return objNew;
}
//类内定义友元函数
friend CNumber operator+(const CNumber& obj1, const CNumber& obj2);
//类外重载
CNumber operator+(const CNumber& obj1, const CNumber& obj2)
{
int nNewNumber = obj1.m_nNumber + obj2.m_nNumber;
CNumber objNew(nNewNumber);
return objNew;
}
int main()
{
CNumber num1(1);
CNumber num2(2);
CNumber num3 = num1 + num2;
num3.Show();//3
return 0;
}
重载 赋值 运算符
- 只能在类内重载。
//类内重载
public:
CNumber& operator=(const CNumber& obj)
{
this->m_nNumber = obj.m_nNumber;
return *this;
}
int main()
{
CNumber num1(2);
CNumber num2 = num1;
num2.Show();//2
return 0;
}
重载 类型转换 运算符
//类内重载
public:
operator int()
{
return m_nNumber;
}
int main()
{
CNumber num1(2);
int a = num1;
std::cout << a << std::endl;//2
return 0;
}
重载 取反 运算符
//类内重载
public:
CNumber& operator!()
{
this->m_nNumber = !this->m_nNumber;
return *this;
}
//类内定义友元函数
friend CNumber& operator!(CNumber& obj);
//类外重载
CNumber& operator!(CNumber& obj)
{
obj.m_nNumber = !obj.m_nNumber;
return obj;
}
int main()
{
CNumber num1(1);
!num1;
num1.Show();//0
return 0;
}
重载 取负值 运算符
//类内重载
public:
CNumber& operator-()
{
this->m_nNumber *= -1;
return *this;
}
//类内定义友元函数
friend CNumber& operator-(CNumber& obj);
//类外重载
CNumber& operator-(CNumber& obj)
{
obj.m_nNumber *= -1;
return obj;
}
int main()
{
CNumber num1(2);
-num1;
num1.Show();//-2
return 0;
}
重载 加等于 运算符
//类内重载
public:
CNumber& operator+=(const CNumber& obj)
{
this->m_nNumber += obj.m_nNumber;
return *this;
}
//类内定义友元函数
friend CNumber& operator+=(CNumber& obj1, const CNumber& obj2);
//类外重载
CNumber& operator+=(CNumber& obj1,const CNumber& obj2)
{
obj1.m_nNumber += obj2.m_nNumber;
return obj1;
}
int main()
{
CNumber num1(2);
CNumber num2(5);
num1 += num2;
num1.Show();//7
return 0;
}
重载 前++ 运算符
//类内重载
public:
CNumber& operator++()
{
++this->m_nNumber;
return *this;
}
//类内定义友元函数
friend CNumber& operator++(CNumber& obj);
//类外重载
CNumber& operator++(CNumber& obj)
{
++obj.m_nNumber;
return obj;
}
int main()
{
CNumber num1(2);
++num1;
num1.Show();//3
return 0;
}
重载 后++ 运算符
//类内重载
public:
CNumber operator++(int)
{
CNumber obj = *this;
++this->m_nNumber;
return obj;
}
//类内定义友元函数
friend CNumber& operator++(CNumber& obj,int);
//类外重载
CNumber& operator++(CNumber& obj,int)
{
CNumber objNew = obj;
++obj.m_nNumber;
return objNew;
}
int main()
{
CNumber num1(2);
num1++;
num1.Show();//3
return 0;
}
重载 << 运算符
//类内重载
public:
CNumber& operator<<(int nValue)
{
printf("%d",nValue);
return *this;
}
CNumber& operator<<(double dValue)
{
printf("%lf", dValue);
return *this;
}