c++中的符号重载:符号的重载也是重载符合重载函数的解析规则,为了让运算符操作数更加人性化。
例如我们抽象一个类的时候,我们有一个Person类
ClassPerson{
int height;
int weight;
int age;
string address
string telephone;
...........
public :
Person();
};
若我们想使用==来比较Persona 和Personb,但是标准的‘==’只能用来比较c++的内置类型,而Person并不是c++的内置类型。于是我们就需要使用符号重载来使这些操作符能够用来比较我们自己定义的类型。大多数运算符都能重载,但是以下的运算符并不能重载。
:://作用域解析
. //成员选择
.* //通过到成员的指针做成员选择
?://三元运算符
.......
那么重载的方式有哪些呢?
1.直接在类内部写重载方法
Class Person{
int height;
int weight;
int age;
string address
string telephone;
...........
public :
Person();
int getA(){}
bool operator== (A a);//定义
};
A::bool operator== (A a){
return this->x==a.x;
}
这里需要注意的是,正常来说,当我们重载等号的时候,想到的是参数有两个,这样才能比较,然而写在类中的运算符重载是没又有两个参数的,只有一个参数。我个人觉得,应该是这样的,当我在调用一个运算符重载的时候,已经初始化了一个类,所以不能再新建两个类,而是使用this指针获取当前类的信息。
2.友元函数
友元函数的作用是让一个函数不处于一个类的作用域之中,且不需要由一个对象去激活(this指针)但是却能访问类中的私有变量。所以使用友元函数进行运算符重载应该如下所示:
Class Person{
int height;
int weight;
int age;
string address
string telephone;
...........
public :
Person();
int getA(){}
friend bool operator== (A a,A b);//定义
};
bool operator== (A a, A b){
return a.x==b.x;
}
3.使用内联函数
内联函数inline相当于是运行时调用,类似与c中的宏。使用内联函数的时候,我们需要注意的一点是,内联函数不能直接访问类里面的私有变量,于是我们需要使用一个get方法,才能访问到类中的私有变量。写法如下
Class Person{
int height;
int weight;
int age;
string address
string telephone;
...........
public :
Person();
int getA(){}
friend bool operator== (A a,A b);//定义
};
inline bool operator== (A a, A b){
return a.getA()==b.getA();
}