本内容都以最常被定义的结构体Point为例
一、重定义赋值运算符:
基本思想分为两大部分:
写在结构体里 与 写在结构体外:
写在结构体里:
- 模板总结:
*结构体名& operator = (结构体名& 变量名)
{
假设已经定义了变量,逐个赋值(一一对应);
return *this;
}*
详情,请看代码。
- 代码如下:
struct Point
{
int x,y;
Point& operator = (Point& a)
{
x=a.x;
y=a.y;
return *this;
};
};
- 自定义了一个Point结构体,应该很好理解,其中:
*this代表指向被赋值的Point变量的地址,这样才能修改变量的值;
取地址符用来指向被修改的变量的地址;
写在结构体外
- 模板总结:
在结构体里定义一个“赋值”函数,
结构体外,用此函数赋值(就是写一个函数,只是变量固定,需一一对应)。
详情,请看代码。
- 代码如下:
struct Point
{
int x,y;
void fuzhi(Point& a);
};
void Point::fuzhi(Point& a)
{
x=a.x;
y=a.y;
return ;
}
- 像这样,现在结构体里加一个赋值函数,表示要赋值(好理解吧)。这样,就定义了一个属于Point结构体的fuzhi()函数。所以需要写“Point::”。这样,通过函数的方式修改变量。
二、重定义加、减、乘、除运算符:
加减乘除的重定义思路一样,所以这里以加法为例:
和重定义赋值运算符类似,将思路分为两个部分:
写在结构体里 与 写在结构体外
写在结构体里
- 模板总结:
结构体名& operator + (结构体名& 变量名)
{
一一对应地赋值;
return *this;
}
- 代码如下
:
Point& operator + (const Point& a)
//const写不写都可以,至少可以得到正确答案
{
x=x+a.x ;
y=y+a.y ;
return *this;
}
- 注意:第一个‘&’不写的话,造成的后果是运算完之后不能赋值给进行运算的两个或几个变量中的一个。(具体症状是报错)
写在结构体外
- 模板总结:
*结构体名 operator + (结构体名& 变量名1,结构体名,变量名2)
{
首先定义一个结构体变量,以这个变量为模板一一对应的计算并赋值。(这个变量可定义为全局变量)
return 这个变量。
}*
- 代码如下:
point operator + (const Point& a,const point& b)
{
point m;
m.x=a.x+b.x;
m.y=a.y+b.y;
return m;
}
- 注意:第一个结构体名后,!不!加!取!地!址!符! 否则,它会警告,虽然并无大碍,但是看着不顺眼。
减、乘、除的重载运算符方法和加法同理,只需要把‘+’换成对应的运算符即可。