菜鸟教程 -- 学的不仅是技术,更是梦想!

C++ 教程
C++ 教程 C++ 简介 C++ 环境设置 C++ 基本语法 C++ 注释 C++ 数据类型 C++ 变量类型 C++ 变量作用域 C++ 常量 C++ 修饰符类型 C++ 存储类 C++ 运算符 C++ 循环 C++ 判断 C++ 函数 C++ 数字 C++ 数组 C++ 字符串 C++ 指针 C++ 引用 C++ 日期 & 时间 C++ 基本的输入输出 C++ 结构体(struct) C++ vector 容器 C++ 数据结构

C++ 面向对象

C++ 类 & 对象 C++ 继承 C++ 重载运算符和重载函数 C++ 多态 C++ 数据抽象 C++ 数据封装 C++ 接口(抽象类)

C++ 高级教程

C++ 文件和流 C++ 异常处理 C++ 动态内存 C++ 命名空间 C++ 模板 C++ 预处理器 C++ 信号处理 C++ 多线程 C++ Web 编程

C++ 资源库

C++ STL 教程 C++ 导入标准库 C++ 标准库 C++ 有用的资源 C++ 实例 C++ 测验 C++ <iostream> C++ <fstream> C++ <sstream> C++ <iomanip> C++ <array> C++ <vector> C++ <list> C++ <forward_list> C++ <deque> C++ <stack> C++ <queue> C++ <priority_queue> C++ <set> C++ <unordered_set> C++ <map> C++ <unordered_map> C++ <bitset> C++ <algorithm> C++ <iterator> C++ <functional> C++ <numeric> C++ <complex> C++ <valarray> C++ <cmath> C++ <string> C++ <regex> C++ <ctime> C++ <chrono> C++ <thread> C++ <mutex> C++ <condition_variable> C++ <future> C++ <atomic> C++ <type_traits> C++ <typeinfo> C++ <exception> C++ <stdexcept> C++ <cstdio> C++ <cstdint> C++ <memory> C++ <new> C++ <utility> C++ <random> C++ <locale> C++ <codecvt> C++ <cassert> C++ <cwchar> C++ <climits> C++ <cfloat> C++ <cstdlib> C++ <numbers> C++ OpenCV
(追記) (追記ここまで)

C++ 重载运算符和重载函数

C++ 允许在同一作用域中的某个函数运算符指定多个定义,分别称为函数重载运算符重载

重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。

当您调用一个重载函数重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策

C++ 中的函数重载

在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。您不能仅通过返回类型的不同来重载函数。

下面的实例中,同名函数 print() 被用于输出不同的数据类型:

实例

#include<iostream>usingnamespacestd; classprintData{public: voidprint(inti){cout << "整数为: " << i << endl; }voidprint(doublef){cout << "浮点数为: " << f << endl; }voidprint(charc[]){cout << "字符串为: " << c << endl; }}; intmain(void){printDatapd; // 输出整数pd.print(5); // 输出浮点数pd.print(500.263); // 输出字符串charc[] = "Hello C++"; pd.print(c); return0; }

当上面的代码被编译和执行时,它会产生下列结果:

整数为: 5
浮点数为: 500.263
字符串为: Hello C++

C++ 中的运算符重载

您可以重定义或重载大部分 C++ 内置的运算符。这样,您就能使用自定义类型的运算符。

重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。

Box operator+(const Box&);

声明加法运算符用于把两个 Box 对象相加,返回最终的 Box 对象。大多数的重载运算符可被定义为普通的非成员函数或者被定义为类成员函数。如果我们定义上面的函数为类的非成员函数,那么我们需要为每次操作传递两个参数,如下所示:

Box operator+(const Box&, const Box&);

下面的实例使用成员函数演示了运算符重载的概念。在这里,对象作为参数进行传递,对象的属性使用 this 运算符进行访问,如下所示:

实例

#include<iostream>usingnamespacestd; classBox{public: doublegetVolume(void){returnlength * breadth * height; }voidsetLength(doublelen){length = len; }voidsetBreadth(doublebre){breadth = bre; }voidsetHeight(doublehei){height = hei; }// 重载 + 运算符,用于把两个 Box 对象相加Boxoperator+(constBox& b){Boxbox; box.length = this->length + b.length; box.breadth = this->breadth + b.breadth; box.height = this->height + b.height; returnbox; }private: doublelength; // 长度doublebreadth; // 宽度doubleheight; // 高度}; // 程序的主函数intmain(){BoxBox1; // 声明 Box1,类型为 BoxBoxBox2; // 声明 Box2,类型为 BoxBoxBox3; // 声明 Box3,类型为 Boxdoublevolume = 0.0; // 把体积存储在该变量中// Box1 详述Box1.setLength(6.0); Box1.setBreadth(7.0); Box1.setHeight(5.0); // Box2 详述Box2.setLength(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0); // Box1 的体积volume = Box1.getVolume(); cout << "Volume of Box1 : " << volume <<endl; // Box2 的体积volume = Box2.getVolume(); cout << "Volume of Box2 : " << volume <<endl; // 把两个对象相加,得到 Box3Box3 = Box1 + Box2; // Box3 的体积volume = Box3.getVolume(); cout << "Volume of Box3 : " << volume <<endl; return0; }

当上面的代码被编译和执行时,它会产生下列结果:

Volume of Box1 : 210
Volume of Box2 : 1560
Volume of Box3 : 5400

可重载运算符/不可重载运算符

下面是可重载的运算符列表:

双目算术运算符 + (加),-(减),*(乘),/(除),% (取模)
关系运算符 ==(等于),!= (不等于),< (小于),> (大于),<=(小于等于),>=(大于等于)
逻辑运算符 ||(逻辑或),&&(逻辑与),!(逻辑非)
单目运算符 + (正),-(负),*(指针),&(取地址)
自增自减运算符 ++(自增),--(自减)
位运算符 | (按位或),& (按位与),~(按位取反),^(按位异或),,<< (左移),>>(右移)
赋值运算符 =, +=, -=, *=, /= , % = , &=, |=, ^=, <<=, >>=
空间申请与释放 new, delete, new[ ] , delete[]
其他运算符 ()(函数调用),->(成员访问),,(逗号),[](下标)

下面是不可重载的运算符列表:

  • .:成员访问运算符
  • .*, ->*:成员指针访问运算符
  • :::域运算符
  • sizeof:长度运算符
  • ?::条件运算符
  • #: 预处理符号

运算符重载实例

下面提供了各种运算符重载的实例,帮助您更好地理解重载的概念。

序号运算符和实例
1一元运算符重载
2二元运算符重载
3关系运算符重载
4输入/输出运算符重载
5 ++ 和 -- 运算符重载
6赋值运算符重载
7函数调用运算符 () 重载
8下标运算符 [] 重载
9类成员访问运算符 -> 重载
AI 思考中...

4 篇笔记 写笔记

  1. #0

    oin625

    178***[email protected]

    224
    值得注意的是:
    • 1、运算重载符不可以改变语法结构。
    • 2、运算重载符不可以改变操作数的个数。
    • 3、运算重载符不可以改变优先级。
    • 4、运算重载符不可以改变结合性。

    oin625

    178***[email protected]

    8年前 (2018年06月01日)
  2. #0

    smallhu

    107***[email protected]

    114

    类重载、覆盖、重定义之间的区别:

    重载指的是函数具有的不同的参数列表,而函数名相同的函数。重载要求参数列表必须不同,比如参数的类型不同、参数的个数不同、参数的顺序不同。如果仅仅是函数的返回值不同是没办法重载的,因为重载要求参数列表必须不同。(发生在同一个类里)

    覆盖是存在类中,子类重写从基类继承过来的函数。被重写的函数不能是static的。必须是virtual的。但是函数名、返回值、参数列表都必须和基类相同(发生在基类和子类)

    重定义也叫做隐藏,子类重新定义父类中有相同名称的非虚函数 ( 参数列表可以不同 ) 。(发生在基类和子类)

    smallhu

    107***[email protected]

    7年前 (2019年03月26日)
  3. #0

    this 指针的作用

    this 指针是一个隐含于每一个非静态成员函数中的特殊指针。它指向正在被该成员函数操作的那个对象。当对一个对象调用成员函数时,编译器先将对象的地址赋给 this 指针,然后调用成员函数,每次成员函数存取数据成员时由隐含使用 this 指针。

    7年前 (2019年10月14日)
  4. #0

    熙梦

    166***[email protected]

    54

    运算符重载的同时也可以发生函数重载!

    #include<iostream>
    using namespace std;
    //加号运算符重载
    class xiMeng
    {
    public:
     int M_A;
     int M_B;
     //通过成员函数运算符重载
     /*xiMeng operator + (xiMeng& p)
     {
     xiMeng temp;
     temp.M_A = this->M_A + p.M_A;
     temp.M_B = this->M_B + p.M_B;
     return temp;
     }*/
    };
    //通过全局函数运算符重载
    xiMeng operator+ (xiMeng& p1, xiMeng& p2)
    {
     xiMeng temp;
     temp.M_A = p1.M_A + p2.M_A;
     temp.M_B = p1.M_B + p2.M_B;
     return temp;
    }
    //运算符重载也可以发生函数重载
    xiMeng operator+ (xiMeng& p, int num)
    {
     xiMeng temp;
     temp.M_A = p.M_A + num;
     temp.M_B = p.M_B + num;
     return temp;
    }
    void xiMengTest() {
     xiMeng p1;
     p1.M_A = 15;
     p1.M_B = 25;
     xiMeng p2;
     p2.M_A = 10;
     p2.M_B = 30;
     //通过全局函数运算符重载
     xiMeng p3 = p1 + p2;
     cout << "p3.M_A = " << p3.M_A << endl;
     cout << "p3.M_B = " << p3.M_B << endl;
     //运算符重载也可以发生函数重载
     xiMeng p4 = p1 + 100;
     cout << "p4.M_A = " << p4.M_A << endl;
     cout << "p4.M_B = " << p4.M_B << endl;
    }
    int main()
    {
     xiMengTest();
     return 0;
    }

    熙梦

    166***[email protected]

    5年前 (2021年05月31日)

点我分享笔记

  • 昵称 (必填)
  • 邮箱 (必填)
  • 引用地址

AltStyle によって変換されたページ (->オリジナル) /