C++知识总结——运算符重载

  • 3.运算符重载
    • 3.1运算符重载概念
    • 3.2运算符重载规则
    • 3.3运算符重载形式

3.运算符重载

3.1运算符重载概念

  C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载或函数多态。

  运算符重载函数定义:
  <返回类型说明符> operator <运算符符号>(<参数表>)
  {
  <函数体>
  }

3.2运算符重载规则

  1. 重载的运算符必须至少有一个操作数是用户定义的类型,防止用户给标准运算符重载。也就是禁止给标准“+”,“-”,“*”,“/”等进行重载,防止出现二义性。
  2. 使用运算符不能违反运算符原来的句法规则。例如不能将%求模运算重载成操作数。
  3. 不能创建新的运算符。
  4. 不能修改运算符原先的优先级。
  5. 不能重载的运算符:
      成员运算符,作用域解析运算符,条件运算符,sizeof运算符,typeid(一个RTTI运算符),const_cast、dynamic_cast、reinterpret_cast、static_cast强制类型转换运算符
  6. 大多数运算符可以通过成员函数和非成员函数进行重载但是下面这四种运算符只能通过成员函数进行重载:
    = 赋值运算符,()函数调用运算符,[ ]下标运算符,->通过指针访问类成员的运算符。

3.3运算符重载形式

  运算符函数重载一般有两种形式:重载为类的成员函数和重载为类的非成员函数。非成员函数通常是友元。(可以把一个运算符作为一个非成员、非友元函数重载。但是,这样的运算符函数访问类的私有和保护成员时,必须使用类的公有接口中提供的设置数据和读取数据的函数,调用这些函数时会降低性能。可以内联这些函数以提高性能。)

  1. 重载为成员函数
      当运算符重载为类的成员函数时,函数的参数个数比原来的操作数要少一个(后置单目运算符除外),这是因为成员函数用this指针隐式地访问了类的一个对象,它充当了运算符函数最左边的操作数。因此:
        (1)双目运算符重载为类的成员函数时,函数只显式说明一个参数,该形参是运算符的右操作数。
        (2)前置单目运算符重载为类的成员函数时,不需要显式说明参数,即函数没有形参。
        (3)后置单目运算符重载为类的成员函数时,函数要带有一个整型形参。

  2. 重载为非成员函数(友元函数)
      当运算符重载为类的友元函数时,由于没有隐含的this指针,因此操作数的个数没有变化,所有的操作数都必须通过函数的形参进行传递,函数的参数与操作数自左至右一一对应。

  3. 两种重载形式的比较
      在多数情况下,将运算符重载为类的成员函数和类的友元函数都是可以的。但成员函数运算符与友元函数运算符也具有各自的一些特点:
        (1)一般情况下,单目运算符最好重载为类的成员函数;双目运算符则最好重载为类的友元函数。
        (2)以下一些双目运算符不能重载为类的友元函数:=、()、[]、->。
        (3)类型转换函数只能定义为一个类的成员函数而不能定义为类的友元函数。
        (4)若一个运算符的操作需要修改对象的状态,选择重载为成员函数较好。
        (5)若运算符所需的操作数(尤其是第一个操作数)希望有隐式类型转换,则只能选用友元函数。
        (6)当运算符函数是一个成员函数时,最左边的操作数(或者只有最左边的操作数)必须是运算符类的一个类对象(或者是对该类对象的引用)。如果左边的操作数必须是一个不同类的对象,或者是一个内部类型的对象,该运算符函数必须作为一个友元函数来实现。
        (7)当需要重载运算符具有可交换性时,选择重载为友元函数。

C++知识总结——运算符重载相关推荐

  1. 【黑马程序员 C++教程从0到1入门编程】【笔记4】C++核心编程(类和对象——封装、权限、对象的初始化和清理、构造函数、析构函数、深拷贝、浅拷贝、初始化列表、友元friend、运算符重载)

    黑马程序员C++教程 文章目录 4 类和对象(类属性[成员属性],类函数[成员函数]) 4.1 封装 4.1.1 封装的意义(三种权限:public公共.protected保护.private私有)( ...

  2. C++之运算符重载(下)

    4.提高 1.运算符重载机制 编译器实现运算符重载实际上就是通过函数重载实现的,可分为全局函数方式,也可分为成员函数方式进行重载,并没有改变原操作符的属性和语义.只是针对某个特定类定义一种新的数据类型 ...

  3. C++实现:自定义数组类型实现相关运算符重载

    运算符重载说明 这次我们通过来自定义数组类型重载[].<<.>>.==.!=运算符来学习C++运算符重载相关知识. C++的运算符重载是C++相对于其他编程语言的一大特色. 在 ...

  4. C++语言运算符重载

    概念 在C语言中,运算符只能用于基本数据类型,例如,可以用==判断两个整数是否相等,但不能用于判断字符串是否相等,也不能用于判断结构体,也不能用于判断类. 在C++中,运算符的重载就是把运算符的符号赋 ...

  5. 运算符重载 返回类型说明符后加_Python3基础:从独特的角度看运算符重载

    本文并不是用来向你介绍运算符重载的基础知识,如果你想了解运算符重载的基础知识,本文可能并不适合你.本文的目的是从独特的角度介绍运算符重载,让你更深入地,更本质地了解什么是运算符重载. 0.什么是运算符 ...

  6. C++基础之运算符重载

    前言 一.友元 二.运算符重载 三.特殊运算符重载 四.建议 前言 个人学习笔记 一.友元 一般来说,类的私有成员只能在类的内部访问,类之外是不能访问它们的.但如果将其他类或函数设置为类的友元(fri ...

  7. 笔记②:牛客校招冲刺集训营---C++工程师(面向对象(友元、运算符重载、继承、多态) -- 内存管理 -- 名称空间、模板(类模板/函数模板) -- STL)

    0618 C++工程师 第5章 高频考点与真题精讲 5.1 指针 & 5.2 函数 5.3 面向对象(和5.4.5.5共三次直播课) 5.3.1 - 5.3.11 5.3.12-14 友元 友 ...

  8. C++:运算符重载与类的赋值运算符重载函数

    目录 章节知识架构 一.运算符重载 1. 运算符重载的基本概念 代码段1 2.关于运算符重载的重要语法细则 二.运算符重载在类中的使用 三.类的默认成员函数:=重载函数(赋值运算符重载) 1.自定义= ...

  9. 十个 C++ 运算符重载示例,看完不懂打我...

    下面是一些 C++ 运算符重载示例,包括算术运算符.赋值运算符.逻辑运算符.成员运算符.关系运算符等等,这些都是使用频率较高的几个运算符重载案例. ⭐️ 所有示例代码均存放于 GitHub: geti ...

最新文章

  1. Permissions 0644 for '/root/.ssh/id_rsa'
  2. 【css】文字溢出,显示省略符号(...)
  3. 【junit】junit4单元测试eclipse
  4. IOS之学习笔记十五(协议和委托的使用)
  5. Qt文档阅读笔记-QQmlApplicationEngine解析与实例(qml与C++混合编程及QQuick与widgets混合)
  6. SLAM_三维点优化时为什么使用逆深度误差而不是深度误差?
  7. 如何在通达信中展现漂亮的港资持股曲线
  8. 中兴B860AV2.1-T_3.0_s905l3-b_uwe5621_线刷固件(附短接点示意图)
  9. 时间与时间戳之间的转换
  10. java模拟器怎么调中文_电脑java模拟器(javagame模拟器)
  11. mysql alert on delete cascade_mysql-我的“ ON DELETE CASCADE”不起作用
  12. OpenGL ES 之uniform和varying
  13. 基于遗传算法的simulink/PID参数整定(s函数)
  14. 图形渲染——实时光线追踪RTRT(Games202)
  15. Altium Designer PCB 插入图片logo的方法
  16. 人力资源数据分析师前景_数据分析师的前途在哪?
  17. 哪个计算机软件可以探究小孔成像,探究小孔成像的奥秘.doc
  18. 随手记高管专访之CEO谷风专访——随手记理财安全吗
  19. 应用长时间置于后台后广播失效_无奈!终于知道为什么关闭了后台应用手机还是卡了!...
  20. {} == {} 结果为什么是false?

热门文章

  1. EDIUS转场特效插件下载v10.1.0.577免费版
  2. css文字超出部分省略号
  3. Spark 开发总结
  4. 怎样启动python_如何运行python
  5. pandas时序数据分析
  6. PMP-34项目资源管理
  7. 惠普HP LaserJet Pro MFP M429dw 打印机驱动
  8. 店盈通:拼多多店铺该怎么运营?店铺运营思路解析
  9. 4 ZooKeeper
  10. 【大整数加法c++】