运算符重载
运算符重载的实质:对象函数的调用
写法:函数返回值 函数名 (参数)
函数返回值由 运算完成后的值决定的
函数名由 operator 加上重载运算符组成
参数:友元函数(一般是全局函数作友元)时,两个参数。 成员函数 一个参数。
以加号重载为例: 友元函数的隐式调用是 对象一 ➕对象二, 显式调用是 operator (对象一,对象二)
成员函数的隐式调用是 对象一 ➕对象二, 显式调用是 对象一. operator (对象二)
运算符重载的原则:
二.重载一个运算符原则:
1.不能改变运算符的初始意义。 (只是一种规范)
2.不能改变运算符的参数数目。如重载运算符+时只用一个操作数是错误的。
3.运算符函数不能包括缺省的参数。
4.绝大部分C++运算符都可以重载,除以下的例外:
. :: . ?*
5.除赋值运算符外,其它运算符函数都可以由派生类继承。
6.运算符重载不改变运算符的优先级和结合性,也不改变运算符的语法结构,即单目、双目运算符只能重载为单目、双目运算符。
加号运算符
《不可以作为左值(返回值为const),不可连续赋值(不返回对象引用)》
1-以成员函数形式重载
#include <iostream>
using namespace std;
class points
{
private:
int x;
int y;
public:
points(int x, int y);
void display();
const points &operator+(const points &point) const;
};
points::points(int x = 0, int y = 0) : x(x), y(y){};
void points::display()
{
cout << "x: " << this->x << "y: " << this->y;
};
const points &points::operator+(const points &point) const
{
return points(this->x + point.x, this->y + point.y);
//在原来的代码里面,表示引用的符号&暗示函数返回的是一个地址,但要注意points是一个临时变量,当函数体执行结束时,points的内存空间也随机消失了,而我们不能返回一个不存在的地址。
// warning: returning reference to temporary [-Wreturn-local-addr]
};
int main()
{
points p1(11, 33);
points p2(44, 22);
// points p3=p1+p2;
points p3;
p3 = p1 + p2;
p3.display();
}
2-以友元函数重载
注意这里全局函数作友元时,重载函数不能为const函数。
在C++中CV指const和volatile—
1、非成员函数不能有CV限定,友元函数不是类的成员函数声明友元函数不能用const限定。
2、静态成员函数不能有CV限定
#include <iostream>
using namespace std;
class points
{
private:
int x;
int y;
public:
points(int x, int y);
void display();
friend const points operator+(const points &point1,const points &point2);//重载为成员函数
};
points::points(int x = 0, int y = 0) : x(x), y(y){};
void points::display()
{
cout << "x: " << this->x << "y: " << this->y;
};
const points operator+(const points &point1,const points &point2) //全局函数
{
return points(point1.x+point2.x,point2.y+point2.y);
//在原来的代码里面,表示引用的符号&暗示函数返回的是一个地址,但要注意points是一个临时变量,当函数体执行结束时,points的内存空间也随机消失了,而我们不能返回一个不存在的地址。
// warning: returning reference to temporary [-Wreturn-local-addr]
};
int main()
{
points p1(11, 33);
points p2(44, 22);
// points p3=p1+p2;
points p3;
p3 = p1 + p2;
p3.display();
}
//不能返回局部变量的指针或者引用