运算符重载(1)

本文详细介绍了C++中的运算符重载,包括其本质是对象函数的调用,以及两种重载方式——成员函数和友元函数的形式。文章强调了重载运算符应保持其初始意义,不变参数数目,不使用缺省参数,并列举了不可重载的运算符。以加号运算符为例,说明了其不能作为左值和不可连续赋值的特性。同时,给出了加号运算符重载的成员函数和友元函数实现示例。
摘要由CSDN通过智能技术生成

运算符重载

运算符重载的实质:对象函数的调用

写法:函数返回值 函数名 (参数)

函数返回值由 运算完成后的值决定的

函数名由 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指constvolatile1、非成员函数不能有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();
}

    
    //不能返回局部变量的指针或者引用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丁金金

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值