重载运算符和重载函数

C++ 中的函数重载

C++ 中的运算符重载

C++ 一元运算符重载

C++ 二元运算符重载

C++ 关系运算符重载

C++ 输入/输出运算符重载

C++ 赋值运算符重载

C++ 函数调用运算符 () 重载

C++ 下标运算符 [] 重载


重载运算符和重载函数

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

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

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

C++ 中的函数重载

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

#include <iostream>using namespace std;class PutData
{
public:void Put_Data(int num){cout <<"整数为: "<< num << endl ;}void Put_Data(double fl){cout <<"浮点数为: " << fl << endl ;}void Put_Data(char ch){cout << "字符为: "<< ch << endl ;}
};void main()
{PutData pd ;pd.Put_Data(5);pd.Put_Data(6.6);pd.Put_Data('c');
}/*输出结果为
整数为: 5
浮点数为: 6.6
字符为: c
*/

C++ 中的运算符重载

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

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

Box operator+(const Box&);

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

Box operator+(const Box&, const Box&);
#include <iostream>
using namespace std;class Line
{
public:Line(int num);int Get_Lenth();Line operator+(const Line& L);
private:int Lenth ;
};Line::Line(int num)
{Lenth = num ;
}int Line::Get_Lenth()
{return Lenth;
}Line Line::operator+(const Line& L)
{Line line(12) ;line.Lenth = this->Lenth + L.Lenth ;return line ;
}void main()
{Line line1(5);Line line2(10);Line line3(0);line3 = line1 + line2 ;cout << "Line3 的长度是" << line3.Get_Lenth() << endl ;
}/*输出结果为
Line3 的长度是15
*/

C++ 一元运算符重载

一元运算符只对一个操作数进行操作,下面是一元运算符的实例:

  • 递增运算符( ++ )和递减运算符( -- )
  • 一元减运算符,即负号( - )
  • 逻辑非运算符( ! )

一元运算符通常出现在它们所操作的对象的左边,比如 !obj、-obj 和 ++obj,但有时它们也可以作为后缀,比如 obj++ 或 obj--。

#include <iostream>using namespace std ;class Distance
{
private:int Dis1 ;int Dis2 ;
public:Distance(int dis1 , int dis2){cout << "creat a object" << endl ;Dis1 = dis1 ;Dis2 = dis2 ;}void DisplayDis(){cout << "Dis1 is " << Dis1 << endl << "Dis2 is " << Dis2 << endl;}Distance operator- (){Dis1 = -Dis1 ;Dis2 = -Dis2 ;return Distance(Dis1 , Dis2);}
};void main()
{Distance d1(10,20);d1.DisplayDis();-d1;d1.DisplayDis();
}/*输出结果为
creat a object
Dis1 is 10
Dis2 is 20
creat a object
Dis1 is -10
Dis2 is -20
*/

C++ 二元运算符重载

二元运算符需要两个参数,下面是二元运算符的实例。我们平常使用的加运算符( + )、减运算符( - )、乘运算符( * )和除运算符( / )都属于二元运算符。就像加(+)运算符。

#include <iostream>using namespace std ;class Distance
{
private:int Dis1 ;int Dis2 ;
public:Distance(int dis1 , int dis2){cout << "creat a object" << endl ;Dis1 = dis1 ;Dis2 = dis2 ;}void DisplayDis(){cout << "Dis1 is " << Dis1 << endl << "Dis2 is " << Dis2 << endl;}Distance operator-(const Distance &dis){Distance d(0,0) ;d.Dis1 = this->Dis1 - dis.Dis1;d.Dis2 = this->Dis2 - dis.Dis2;return d ;}
};void main()
{Distance d1(10,20);Distance d2(5,5);Distance d3(0,0);d3 = d1 - d2 ;d3.DisplayDis();
}/*输出结果为
creat a object
creat a object
creat a object
creat a object
Dis1 is 5
Dis2 is 15
*/

C++ 关系运算符重载

C++ 语言支持各种关系运算符( < 、 > 、 <= 、 >= 、 == 等等),它们可用于比较 C++ 内置的数据类型。

您可以重载任何一个关系运算符,重载后的关系运算符可用于比较类的对象。

#include <iostream>using namespace std ;class Distance
{
private:int Dis1 ;int Dis2 ;
public:Distance(int dis1 , int dis2){cout << "creat a object" << endl ;Dis1 = dis1 ;Dis2 = dis2 ;}void DisplayDis(){cout << "Dis1 is " << Dis1 << endl << "Dis2 is " << Dis2 << endl;}bool operator<(const Distance &dis){if(this->Dis1 < dis.Dis1){return true ;}else if(this->Dis1 > dis.Dis1){return false ;}else {return false ;}}
};void main()
{Distance d1(10,20);Distance d2(5,5);if(d1 < d2){cout << "d1 小 " << endl ;}else{cout << "d2 小 " << endl ;}
}/*输出结果为
creat a object
creat a object
d2 小
*/

C++ 输入/输出运算符重载

C++ 能够使用流提取运算符 >> 和流插入运算符 << 来输入和输出内置的数据类型。您可以重载流提取运算符和流插入运算符来操作对象等用户自定义的数据类型。

在这里,有一点很重要,我们需要把运算符重载函数声明为类的友元函数,这样我们就能不用创建对象而直接调用函数。

#include <iostream>
using namespace std;class Distance
{private:int feet;             // 0 到无穷int inches;           // 0 到 12public:// 所需的构造函数Distance(){feet = 0;inches = 0;}Distance(int f, int i){feet = f;inches = i;}friend ostream &operator<<( ostream &output, const Distance &D ){ output << "F : " << D.feet << " I : " << D.inches;return output;            }friend istream &operator>>( istream  &input, Distance &D ){ input >> D.feet >> D.inches;return input;            }
};
int main()
{Distance D1(11, 10), D2(5, 11), D3;cout << "Enter the value of object : " << endl;cin >> D3;cout << "First Distance : " << D1 << endl;cout << "Second Distance :" << D2 << endl;cout << "Third Distance :" << D3 << endl;return 0;
}/*输出结果为
Enter the value of object :
15
15
First Distance : F : 11 I : 10
Second Distance :F : 5 I : 11
Third Distance :F : 15 I : 15
*/

C++ 赋值运算符重载

就像其他运算符一样,您可以重载赋值运算符( = ),用于创建一个对象,比如拷贝构造函数。

#include <iostream>
using namespace std;class Distance
{private:int feet;             // 0 到无穷int inches;           // 0 到 12public:// 所需的构造函数Distance(){feet = 0;inches = 0;}Distance(int f, int i){feet = f;inches = i;}void operator=(const Distance &D ){ feet = D.feet;inches = D.inches;}// 显示距离的方法void displayDistance(){cout << "F: " << feet <<  " I:" <<  inches << endl;}};
int main()
{Distance D1(11, 10), D2(5, 11);cout << "First Distance : "; D1.displayDistance();cout << "Second Distance :"; D2.displayDistance();// 使用赋值运算符D1 = D2;cout << "First Distance :"; D1.displayDistance();return 0;
}/*输出结果为
First Distance : F: 11 I:10
Second Distance :F: 5 I:11
First Distance :F: 5 I:11
*/

C++ 函数调用运算符 () 重载

函数调用运算符 () 可以被重载用于类的对象。当重载 () 时,您不是创造了一种新的调用函数的方式,相反地,这是创建一个可以传递任意数目参数的运算符函数。

#include <iostream>
using namespace std;class Distance
{private:int feet;             // 0 到无穷int inches;           // 0 到 12public:// 所需的构造函数Distance(){feet = 0;inches = 0;}Distance(int f, int i){feet = f;inches = i;}// 重载函数调用运算符Distance operator()(int a, int b, int c){Distance D;// 进行随机计算D.feet = a + c + 10;D.inches = b + c + 100 ;return D;}// 显示距离的方法void displayDistance(){cout << "F: " << feet <<  " I:" <<  inches << endl;}};
int main()
{Distance D1(11, 10), D2;cout << "First Distance : "; D1.displayDistance();D2 = D1(10, 10, 10); // invoke operator()cout << "Second Distance :"; D2.displayDistance();return 0;
}/*输出结果为
First Distance : F: 11 I:10
Second Distance :F: 30 I:120
*/

C++ 下标运算符 [] 重载

下标操作符 [] 通常用于访问数组元素。重载该运算符用于增强操作 C++ 数组的功能。

#include <iostream>
using namespace std;
const int SIZE = 10;class safearay
{private:int arr[SIZE];public:safearay() {register int i;for(i = 0; i < SIZE; i++){arr[i] = i;}}int& operator[](int i){if( i > SIZE ){cout << "索引超过最大值" <<endl; // 返回第一个元素return arr[0];}return arr[i];}
};
int main()
{safearay A;cout << "A[2] 的值为 : " << A[2] <<endl;cout << "A[5] 的值为 : " << A[5]<<endl;cout << "A[12] 的值为 : " << A[12]<<endl;return 0;
}/*输出结果为
A[2] 的值为 : 2
A[5] 的值为 : 5
索引超过最大值
A[12] 的值为 : 0
*/

部分资料来源于菜鸟教程

C++——重载运算符和重载函数相关推荐

  1. 面向对象编程(三):重载运算符和重载函数

    C++ 重载运算符和重载函数 C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载. 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是 ...

  2. C++基础教程之重载运算符和重载函数

    C++ 重载运算符和重载函数 C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载. 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是 ...

  3. C++ | C++ 重载运算符和重载函数

    文章目录 C++ | C++ 重载运算符和重载函数 C++ 重载运算符和重载函数 C++ 中的函数重载 实例1: C++ 中的运算符重载 实例2: 可重载运算符/不可重载运算符 运算符重载实例 运算符 ...

  4. C++ 重载运算符和重载函数(一)

    C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载. 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不 ...

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

    参考:http://www.runoob.com/cplusplus/cpp-overloading.html https://www.cnblogs.com/CaiNiaoZJ/archive/20 ...

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

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

  7. C++语言之可重载运算符/不可重载运算符

    下面是可重载的运算符列表: 双目算术运算符 + (加),-(减),*(乘),/(除),% (取模) 关系运算符 ==(等于),!= (不等于),< (小于),> (大于),<=(小于 ...

  8. 类的6个默认成员函数:构造函数、析构函数、拷贝构造函数、重载运算符、三/五法则

    文章目录 6个默认成员函数 构造函数 概念 默认构造函数的类型 默认实参 概念 默认实参的使用 默认实参声明 全局变量作为默认实参 某些类不能依赖于编译器合成的默认构造函数 第一个原因 第二个原因 第 ...

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

    C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载. 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不 ...

最新文章

  1. centos下部署tomcat详解
  2. linux多核单进程,Linux的在多核处理器3个处理(每个进程在不同的核心上运行)之间共享存储器/ SMP...
  3. iOS开发网络篇—网络请求(HTTP协议)小结(转)
  4. PostgreSQL在何处处理 sql查询之十三
  5. Java Statement PK PrepareStatement
  6. ssms18还原数据_SSMS 18中的静态数据屏蔽
  7. 还在用tm?你OUT啦!
  8. R语言学习笔记(1)
  9. java访问kudu,KUDU的java操作
  10. sql server 标准版升级专业版或者开发版没有sql server profiler
  11. C# OCR 文字识别
  12. Unity实时全局光照和烘焙全局光照 Unity2019
  13. 七夕了,给你的那个TA画上一箭倾心吧~
  14. SecureCRT和SecureFX(一)下载、安装、注册
  15. HTML(网页设计)基础到加强
  16. 火山小视频伪原创方法 视频文件分割改变md5
  17. Ubuntu 微信QQ安装
  18. 神经网络训练之交叉验证
  19. C#面试时被人问你是如何优化你的代码的,该从哪些方面进行回答?
  20. 关于我对未来房价的看法,深度剖析,值得一看

热门文章

  1. Servlet和JAVA BEAN 分析探讨
  2. ZH奶酪:Python按行读取文件
  3. 为什么一个星期是7天
  4. Android构建boot.img(一):root目录与ramdisk.img的生成
  5. HTML解析原理概括(转载)
  6. mysql 5.6到percona 5.6小版本升级
  7. 单指手势,旋转,缩放
  8. Data Member 的存取
  9. foreach对集合的输出作用
  10. PMAboutView