文章目录

  • 1.运算符重载
  • 2.成员函数重载
  • 3.非成员函数重载
  • 4.运算符重载规则

1.运算符重载

  • 运算符重载允许把标准运算符(如+、—、*、/、<、>等)应用于自定义数据类型的对象
  • 直观自然,可以提高程序的可读性
  • 体现了C++的可扩充性
  • 运算符重载仅仅只是语法上的方便,它是另一种函数调用的方式
  • 运算符重载,本质上是函数重载
  • 不要滥用重载、因为它只是语法上的方便,所以只有在涉及的代码更容易写、尤其是更易读时才有必要重载

2.成员函数重载

  • 成员函数原型的格式:
函数类型 operator 运算符(参数表);
  • 成员函数定义的格式:
函数类型 类名::operator 运算符(参数表){函数体;}

3.非成员函数重载

  • 友元函数原型的格式:
friend 函数类型 operator 运算符(参数表);
  • 友元函数定义的格式:
friend 函数类型 类名::operator 运算符(参数表){函数体;
}
  • eg:实现一个复数类,22cpp\01.cpp
#include "Complex.h"int main(void)
{Complex c1(3, 5);Complex c2(4, 6);// c1.Add(c2);// c1.Display();//若成员函数或者友元函数都有,VS2008会先运行成员函数重载的函数,但是在VC6中,这俩不能共存//如果以成员函数的方式重载,等价于c1.operator+(c2)//如果以友元函数的方式重载,等价于operator+(c1+c2),该operator+的作用域是全局的,不是类作用域Complex c3 = c1 + c2;   c1.Display();c2.Display();c3.Display();
}
  • 类声明及定义
    22cpp\Complex.h
#ifndef _CONPLEX_H_
#define _CONPLEX_H_class Complex
{public:Complex(int real, int imag);Complex();~Complex();Complex& Add(const Complex& other);void Display() const;Complex operator+(const Complex& other);//友元函数重载,比成员函数重载多一个参数,因为友元函数不是类的成员,它没有隐含一个自身对象(第一个参数)friend Complex operator+(const Complex& c1, const Complex& c2);private:int real_;int imag_;
};#endif /* _CONPLEX_H_ */

22cpp\Complex.cpp

#include "Complex.h"
#include <iostream>
using namespace std;
Complex::Complex(int real, int imag) : real_(real), imag_(imag)
{}Complex::Complex()
{}Complex::~Complex()
{}
//返回的是自身的引用,所以不会调用拷贝构造函数
Complex& Complex::Add(const Complex& other)
{real_+=other.real_;imag_+=other.imag_;return *this;
}//运算符重载本质上是函数重载
//Complex c3=c1+2;因为要将返回的对象赋值给c3,返回了一个新的对象,这里c1和c2对象是不发生改变的
//而上面的那个Add会将c1对象发生改变,所以不能返回*this
Complex Complex::operator+(const Complex& other)
{int r = real_ + other.real_;int i = imag_ + other.imag_;return Complex(r, i);
}Complex operator+(const Complex& c1, const Complex& c2)
{int r = c1.real_ + c2.real_;int i = c1.imag_ + c2.imag_;return Complex(r, i);
}void Complex::Display() const
{cout<<real_<<"+"<<imag_<<"i"<<endl;
}
  • 测试:
    c1.Add(c2);
    c1.Display();

    Complex c3 = c1 + c2;
    c1.Display();
    c2.Display();
    c3.Display();
    c1与c2都没有发生改变,只有c3变了

4.运算符重载规则

  • 运算符重载不允许发明新的运算符。
  • 不能改变运算符操作对象的个数。
  • 运算符被重载后,其优先级和结合性不会改变。
  • 不能重载的运算符:
  • 一般情况下,单目运算符最好重载为类的成员函数;双目运算符则最好重载为类的友元函数。
  • 以下一些双目运算符不能重载为类的友元函数:=、()、[]、->。
=运算符是双目运算符,调用时,类型不匹配,返回的时候类型也不匹配,不直观,会破坏原有的运算符
class Test
{public:Test& operator=(const Test& other);
private:int x_;
};
Test t1;
Test t2;
t1=t2;//等价于t1.operator=(t2);若是写成类的友元函数,Test是类D的派生类的话
class D : public Test
{friend Test& operator=(Test& t1, const Test& t2);
};Test& operator=(Test& t1, const Test& t2)
{t1.x_ = t2.x_;return t1;
}
D d;
Test t;
D = d//等价于D.operator=(d);会出现类型不匹配,返回时类型也不匹配
  • 类型转换运算符只能以成员函数方式重载
  • 流运算符只能以友元的方式重载

(P22)运算符重载:运算符重载 ,成员函数重载 ,非成员函数重载 ,运算符重载规则相关推荐

  1. C++ Primer 第五版 第7章类 7.1——类讲解(成员函数、非成员函数、构造函数)

    习题答案请参考:C++ Primer 第五版 第7章类 7.1--类讲解(成员函数.非成员函数.构造函数)习题答案 目录 7.1 类讲解(成员函数.非成员函数.构造函数) 成员函数 this cons ...

  2. C++ Primer 第五版 第7章类 7.1——类讲解(成员函数、非成员函数、构造函数)习题答案

    理论讲解请参考:C++ Primer 第五版 第7章类 7.1--类讲解(成员函数.非成员函数.构造函数) 目录 7.1 定义抽象数据类型习题答案 7.4&7.5 7.6&7.7 7. ...

  3. C++中的成员函数与非成员函数

    1.成员函数和非成员函数 其实简单来说成员函数是在类中定义的函数,而非成员函数就是普通函数,即不在类中定义的函数,其中非成员函数比较典型的是友元函数. 2.详细解释 成员函数是类定义的一部分,通过特定 ...

  4. 重载运算符:作为成员函数还是非成员函数

    非成员函数应是友元函数,这样它才能直接访问类的私有数据. Time operator+(const Time &t) const; //成员函数 也可以使用下面原型: friend Time ...

  5. 重载运算符作为成员函数还是非成员函数

    一.定义为成员函数的运算符 1. 赋值.调用.下标.成员访问箭头运算符(=.().[].->) 2. 改变对象状态的运算符或者与给定类型密切相关的运算符(递增++.递减--.解引用*) 3. 复 ...

  6. 成员函数与非成员函数的使用与区分

    1.区分方式 成员函数与成员变量都是类当中的定义 函数.变量 在类中: 成员函数 成员变量 函数不在类中: 全局函数 2.局限性 全局函数无法访问类中的 私有成员 如果确实需要,那么需要将该函数声明为 ...

  7. 将类的成员函数作为回调函数(外一篇:友元函数)

    转自:http://blog.csdn.net/xylary/article/details/1548596 将类成员函数用做C回调函数 提出问题:  回调函数是基于C编程的Windows SDK的技 ...

  8. c++函数指针和函数对象

    C++ 函数指针和函数对象 一. 导述 二.c++成员函数在内存中的存储方式 补1:静态数据和常量的区别: 三.函数指针 四.函数对象 一. 导述 博主认为,要想正确深入了解c++中的函数类型和函数指 ...

  9. C++运算符重载形式--成员函数or友元函数?

    1.C++操作符重载形式-成员函数or友元函数 1.对运算符重载,需要坚持四项基本原则: 不可臆造运算符: 运算符原有操作数的个数.优先级和结合性不能改变: 操作数中至少一个是自定义类型: 保持重载运 ...

最新文章

  1. Cisco DHCP and NAT config
  2. 网转 mm IOS 报表
  3. centos下搭建网站服务器,Centos7搭建web服务器
  4. oracle异机恢复 open resetlogs 报:ORA-00392
  5. Java之数据类型的细节
  6. Python算法——查找数组前三名
  7. 淘宝大秒系统设计详解
  8. ubuntu12.04/14.04/16.04 安装搜狗输入法 解决shift按键不能切换英文输入
  9. 系统问题调试:appcrash
  10. 关于报 程序包com.jt.pojo不存在、报 Process terminated、Failed to execute goal on project jt-manage: 的问题,已解决
  11. 打印机驱动装上了,却无法正常打印的问题解决方法
  12. 隐形数字水印_Android 实现图片水印与隐形数字水印
  13. 一文读懂图像三原色原理
  14. linux环境中设定开机自启动与定时任务
  15. 游客丽江住店被蚊子咬醒 前台:养的宠物 死1只赔100
  16. object_detection源码解析-box_list
  17. 初中计算机基础知识教程,计算机基础知识(初级中学教程).doc
  18. 一些计时软件,生产力工具
  19. 【python】制作商品历史价格查询
  20. php日期去掉分秒,Phpcms教程:解决内容页去掉发布时间的小时,分秒问题

热门文章

  1. 某腾LOL开发负责人教你如何用Java实现一把 LOL 案例,学会模板设计模式!
  2. 木偶娃娃的伤感日志推荐:只是一场赢不了的游戏
  3. Linux用函数打开wps,Ubuntu使用wps 笔记
  4. Unity3D游戏开发之GUI的使用
  5. 无法显示隐藏的文件或文件夹
  6. 案例:Java多态实现披萨制作2.0
  7. 3.layout-2021年11月2日
  8. 日记侠:朋友圈内容规划5点建议
  9. 水客欲替代黄牛党 超5000部水货iPhone 6进京
  10. SAP ABAP WBS元素内外码转换过程中检查退出问题