C++运算符重载的用法和规则
C++ 的一大特性就是重载,重载使得程序更加简洁高效。在 C++ 中不只函数可以重载,运算符也可以重载,运算符重载主要是面向对象之间的。
在 C++ 中,运算符的操作对象可以是基本的数据类型,也可以是类中重新定义的运算符,赋予运算符新的功能,对类对象进行相关操作。在类中重新定义运算符,赋予运算符新的功能以适应自定义数据类型的运算,就称为运算符重载。
我们知道重载的运算符,如运算符
本文将针对运算符重载的语法、规则和方式进行介绍。
【示例1】下面通过案例演示“+”“−”运算符的重载,C++ 代码如下:
通过上面讲解可以知道,重载运算符并没有改变其原来的功能,只是增加了针对自定义数据类型的运算功能,具有了更广泛的多态特征。
运算符重载的具体规则如下:
如果是双目运算符重载为类的成员函数,则它有两个操作数:左操作数是对象本身的数据,由
双目运算符重载后的调用格式如下所示:
如果是单目运算符重载为类的成员函数,需要确定重载的运算符是前置运算符还是后置运算符。
如果是前置运算符,则它的操作数是函数调用者,函数没有参数,其调用格式如下所示:
如果重载的是后置运算符“++”,则运算符重载函数需要带一个整型参数,即“operator++(int)”,参数 int 仅仅表示后置运算,用于和前置运算区分,并无其他意义。
【示例2】为了加深读者的理解,下面通过案例演示前置运算符“++”与后置运算符“++”的重载。C++代码如下:
由运行结果可知,对象 a1 先输出结果后执行“++”运算,而对象 a2 先执行“++”运算后输出结果。
【示例3】下面通过案例演示将运算符“+”和“−”重载为类的友元函数,C++代码如下:
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
在 C++ 中,运算符的操作对象可以是基本的数据类型,也可以是类中重新定义的运算符,赋予运算符新的功能,对类对象进行相关操作。在类中重新定义运算符,赋予运算符新的功能以适应自定义数据类型的运算,就称为运算符重载。
我们知道重载的运算符,如运算符
+可以进行算术的加法运算,在 String 类中可以连接两个字符串;运算符>> 和 <<可以对数据进行右移和左移运算,在输入、输出流类中可以实现输入和输出操作。本文将针对运算符重载的语法、规则和方式进行介绍。
C++运算符重载的语法
在 C++ 中,使用 operator 关键字定义运算符重载。运算符重载语法格式如下:
返回值类型 operator 运算符名称 (参数列表)
{
...//函数体
}
【示例1】下面通过案例演示“+”“−”运算符的重载,C++ 代码如下:
#include<iostream>
using namespace std;
class A
{
private:
int _x;
int _y;
public:
A(int x=0,int y=0):_x(x),_y(y){}
void show() const; //输出数据
A operator+(const A& a) const; //重载"+"运算符
A operator-(const A& a) const; //重载"-"运算符
};
void A::show() const //show()函数的实现
{
cout<<"(_x,_y)="<<"("<<_x<<","<<_y<<")"<<endl;
}
A A::operator+(const A& a) const //重载"+"运算符的实现
{
return A(_x+a._x,_y+a._y);
}
A A::operator-(const A& a) const //重载"-"运算符的实现
{
return A(_x-a._x,_y-a._y);
}
int main()
{
A a1(1,2);
A a2(4,5);
A a;
cout<<"a1: ";
a1.show();
cout<<"a2: ";
a2.show();
a=a1+a2; //实现两个对象相加
cout<<"a: ";
a.show();
a=a1-a2; //实现两个对象相减
cout<<"a: ";
a.show();
return 0;
}
运行结果:
a1: (_x,_y)=(1,2)
a2: (_x,_y)=(4,5)
a: (_x,_y)=(5,7)
a: (_x,_y)=(-3,-3)
- 第 18~21 行代码重载了运算符“+”;
- 第 22~25 行代码重载了运算符“−”;
- 第 28~29 行代码创建并初始化类A的对象 a1 和 a2;
- 第 35 行代码通过重载的运算符“+”实现对象 a1、a2 相加并将结果保存到对象 a 中;
- 第 38 行代码通过重载的运算符“−”实现对象 a1、a2 相减并将结果保存到对象 a 中。
通过上面讲解可以知道,重载运算符并没有改变其原来的功能,只是增加了针对自定义数据类型的运算功能,具有了更广泛的多态特征。
C++运算符重载的规则
上面我们讲解了运算符重载的语法格式,需要注意的是,有的运算符是不可以重载的,并且运算符重载不可以改变语义。运算符重载的具体规则如下:
-
只能重载 C++ 中已有的运算符,且不能创建新的运算符。例如,一个数的幂运算,试图重载
**为幂运算符,使用 2**4 表示 2^4 是不可行的。 - 重载后运算符不能改变优先级和结合性,也不能改变操作数和语法结构。
- 运算符重载的目的是针对实际运算数据类型的需要,重载要保持原有运算符的语义,且要避免没有目的地使用运算符重载。例如,运算符“+”重载后实现相加的功能,而不会重载“+”为相减或者其他功能。
-
并非所有 C++ 运算符都可以重载,可以重载的运算符如表 1 所示。其他运算符是不可以重载的,如
::、.、.*、?:、sizeof、typeid等。
| + | - | * | / | % | ^ | & |
| | | 〜 | ! | , | = | < | > |
| >= | <= | ++ | -- | « | >> | == |
| != | && | || | += | -= | /= | %= |
| ^= | &= | != | *= | <<= | >>= | [] |
| () | -> | ->* | new | new[] | delete | delete[] |
C++运算符重载的形式
运算符重载一般有两种形式:重载为类的成员函数和重载为类的友元函数。下面分别对这两种形式进行详细讲解。1) 重载为类的成员函数
重载“+”“−”运算符为类的成员函数,成员函数可以自由地访问本类的成员。运算的操作数会以调用者或参数的形式表示。如果是双目运算符重载为类的成员函数,则它有两个操作数:左操作数是对象本身的数据,由
this 指针指出;右操作数则通过运算符重载函数的参数列表传递。双目运算符重载后的调用格式如下所示:
左操作数.运算符重载函数(右操作数);
【示例1】中重载“+”运算符,当调用 a1+a2 时,其实就相当于函数调用 a1.oprerator+(a2)。如果是单目运算符重载为类的成员函数,需要确定重载的运算符是前置运算符还是后置运算符。
如果是前置运算符,则它的操作数是函数调用者,函数没有参数,其调用格式如下所示:
操作数.运算符重载函数();
例如重载单目运算符“++”,如果重载的是前置运算符“++”,则 ++a1 的调用相当于调用函数 a1.operator++()。如果重载的是后置运算符“++”,则运算符重载函数需要带一个整型参数,即“operator++(int)”,参数 int 仅仅表示后置运算,用于和前置运算区分,并无其他意义。
【示例2】为了加深读者的理解,下面通过案例演示前置运算符“++”与后置运算符“++”的重载。C++代码如下:
#include<iostream>
using namespace std;
class A
{
private:
int _x;
int _y;
public:
A(int x=0,int y=0):_x(x),_y(y){}
void show() const; //输出数据
A operator++(); //重载前置“++”
A operator++(int); //重载后置“++”
};
void A::show() const
{
cout<<"(_x,_y)="<<"("<<_x<<","<<_y<<")"<<endl;
}
A A::operator++() //前置“++”实现
{
++_x;
++_y;
return *this;
}
A A::operator++(int) //后置“++”实现
{
A a=*this;
++(*this); //调用已经实现的前置“++”
return a;
}
int main()
{
A a1(1,2), a2(3,4);
(a1++).show();
(++a2).show();
return 0;
}
运行结果:
(_x,_y)=(1,2)
(_x,_y)=(4,5)
- 第 11~12 行代码分别在类 A 中声明前置“++”和后置“++”运算符重载函数;
- 第 18~23 行代码在类外实现前置“++”运算符重载函数,在函数内部,类的成员变量进行自增运算,然后返回当前对象(即this指针所指向的对象);
- 第 24~29 行代码在类外实现后置“++”运算符重载函数,在函数内部,创建一个临时对象保存当前对象的值,然后再将当前对象自增,最后返回保存初始值的临时对象;
- 第 32~34 行代码创建了两个对象 a1、a2,a1 调用后置“++”,a2 调用前置“++”。
由运行结果可知,对象 a1 先输出结果后执行“++”运算,而对象 a2 先执行“++”运算后输出结果。
2) 重载为类的友元函数
运算符重载为类的友元函数,需要在函数前加 friend 关键字,其语法格式如下所示:
friend 返回值类型 operator 运算符(参数列表)
{
...//函数体
}
【示例3】下面通过案例演示将运算符“+”和“−”重载为类的友元函数,C++代码如下:
#include<iostream>
using namespace std;
class A
{
private:
int _x;
int _y
public:
A(int x=0,int y=0):_x(x),_y(y){}
void show() const; //输出数据
friend A operator+(const A& a1, const A& a2) ; //重载为类的友元函数
friend A operator-(const A& a1, const A& a2); //重载为类的友元函数
};
void A::show() const
{
cout<<"(_x,_y)="<<"("<<_x<<","<<_y<<")"<<endl;
}
A operator+(const A& a1,const A& a2)
{
return A(a1._x+a2._x,a1._y+a2._y);
}
A operator-(const A& a1,const A& a2)
{
return A(a1._x-a2._x,a1._y-a2._y);
}
int main()
{
A a1(1,2);
A a2(4,5);
A a;
cout<<"a1: ";
a1.show();
cout<<"a2: ";
a2.show();
a=a1+a2;
cout<< "a: ";
a.show();
a=a1-a2;
cout<<"a: ";
a.show();
return 0;
}
运行结果:
a1: (_x,_y)=(1,2)
a2: (_x,_y)=(4,5)
a: (_x,_y)=(5,7)
a: (_x,_y)=(-3,-3)
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。