运算符重载:与function overloading异曲同工的是,C++提供所谓的Operator overloading。所谓operators是像  +(加)-(減)*(乘)/(除)>>(位右移)
<<(位左移)之类的符号,代表一种动作。

  面对operators,我们应该把他想像是一种函数,只不过形式比较特殊罢了。一般函数的参数出现在括号()之中,而operator的参数围绕着一个operator符号(之前或之后),编程语言内置的数据类型(比如整数`int`、浮点数`float`、长整数`long`等)所使用的操作符(比如加法`+`、减法`-`、乘法`*`等)是由语言本身直接提供的,而不是通过任何外部库或模块来实现的。

  C++允许程序员为class type's object设计专门的operators,使objects的操作能够像内建型别的一样的自然而直观。让operator以种形式呈现,但符号不变,这个就是operator overloading。

  Operator overloading的存在一下褒贬不一,支持者认为它使得程序代码变得更精简漂亮,反对者认为容易把程序员搞迷糊掉。但是,我想,谁都不可否认下面这样的程序代码确实是精简漂亮:
  

CString str1("Hello, I am J.J.Hou, ");
CString str2("How are you?");
CString str3 = str1 + str2; // + 是 CString的一个overloaded operator
// 于是 str3 为 "Hello, I am J.J.Hou, How are you?"
int i = 5;
double pi = 3.141592653;
cout << "i=" << i << " and pi=" << pi << endl;
// 于是 console 屏幕上出现"i=5 and pi=3.141592653"。

  现在让我示范一个overloaded operator的作法,只要在以下类的代码中加入第18~21行的+号的重载代码,即可完成CPoint的加法运算:

 1 class CPoint{
2
3 public:
4
5 CPoint()
6 {
7 _x=0;
8
9 }
10
11 CPoint(float y){
12
13 _x=y;
14 }
15 float x(){return _x;}
16 void x(float xval){_x=xval;}
17
18 CPoint operator+(const CPoint& pt) const //对+号进行重载
19 {
20 return CPoint(_x+pt._x);
21 }
22
23 protected:
24 float _x;
25
26 };

  以operator开头的函数,表示是个运算子。加法运算子需要左右两个运算元(operands),左侧运算元即成为本函数的this指向的对象,右侧运算元则是本函数的参数pt。上述函数代码如果像下面这样表示,会比较清晰,但两者其实是相同的(因为this指针是个隐藏参数):

    CPoint operator+(const CPoint& pt) const  //对+号进行重载
{
return CPoint(this->_x+pt._x);
}

  有了上述的 CPoint::operator+,现在你可以这么使用它:

1 CPoint pt1(7.2), pt2(5.3), pt3;
2 pt3 = pt1 + pt2;
3 cout << "pt3.x = " << pt3.x() << endl; // 12.5

  C++中,<<和>>是最常用的重载运算符,用于表示对标准输入输出设备(如屏幕和键盘)的读写操作,极大地方便了编程,可替代繁琐的printf()和scanf()函数。这两个运算符在iostream库中定义,为C++编程提供了极大的便利。

  Insertion Operator << for stdout: <<本来是位左移运算符,但是在C++的标准库iostream中被改头换面,其左侧的运算元(operand)被指定为cout(console output device),右侧运算元是一个内建型别的objects。我们可以利用它很方便的对cout连续输出各种内建型别的数据或信息(也是一种objects),不必像C程序那样需要识别不同类型的数据在printf()中的格式符号(如 %s、%d、%f...):

1 #include <iostream.h>
2 ...
3 int i = 5;
4 double pi = 3.141592653;
5 cout << "i=" << i << " and pi=" << f << endl;

  Extraction Operator(>>) for stdin:>>本来是位右移运算符,但在C++标准的iostream中被改头换面,其左侧运算元是cin(console input device),右侧运算元是一个内建型别的object。例如:

1 #include <iostream.h>
2 ...
3 float f;
4 cout << "f = ? ";
5 cin >> f;

  程序使用者在健盘上输入,会经由cin装置流往f变量,其作用相当于C runtime library中的scanf()。

  Insertion Operator << for file:就像iostream支持对user‘s terminal的输入输出一样,c++另有一组class types支持对文件的输入输出:

  1.ifstream衍生自istream,支持文件的输入。

  2.ofstream衍生自 ostream,支持文件的输出。

  3. fstream衍生自 iostream, 支持文件的输入输出。

  如果需要这些class type,必须导入对应的header file。请注意,fstream已经含有iostream,所以不需要重复导入;

  下面是信息输入到文件的案例:

#0001 #include <fstream.h> // include iostream.h
#0002
#0003 int main()
#0004 {
#0005   cout << "All your keyboard input in monitor "
#0006       << "will into copy.txt.\n"
#0007       << "Terminate by ^Z\n\n";
#0008
#0009   ofstream outFile("copy.txt");
#0010   if (!outFile) {
#0011     cout << "Cannnot open copy.txt for output" << endl;
#0012     return -1;
#0013   }
#0014
#0015   char c;
#0016   while (cin.get(c)) // get each char from keyboard
#0017   outFile << c; // outFile.put(c) 亦 可
#0018
#0019   return 0;
#0020 }

  当程序执行后,会先提示输入,然后接收所有来自于键盘的字符,一一放进”copy.txt"文件中,直到接收到^z 才停止。

  Extraction Operator >> for file:下面是将文件的内案输出到屏幕上的示例:

#0001 #include <fstream.h> // include iostream.h
#0002
#0003 int main()
#0004 {
#0005   cout << "All text in copy.txt "
#0006   << "will stream into monitor.\n\n";
#0007
#0008   ifstream inFile("copy.txt");
#0009   if (!inFile) {
#0010     cout << "Cannnot open copy.txt for input" << endl;
#0011     return -1;
#0012   }
#0013
#0014   char c;
#0015   while (inFile.get(c)) // get each char from file
#0016   cout.put(c); // output to monitor
#0017
#0018   return 0;
#0019 }

  当程序执行后,会先给一个提示,然后从文件 "copy.txt" 中一一读出每一个字符,显示于屏幕上。上述第0015行如果改为while (inFile >> c) // get each char from file,虽然也能读出字符,但空格会被忽略,这个并非我们所想要的。

C++多态与虚拟:运算符重载(Operator Overloading)的更多相关文章

  1. 【C++复习】第八章 多态性(1)(多态类型、运算符重载)

    1.多态性 1.1 什么是多态? 多态是指相同消息被不同对象接收后导致不同的行为,所谓消息是指对类成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数. 消息在C++编程中指的是对类的成员 ...

  2. c++ 运算符重载operator

    一般格式为: 函数类型 operator 运算符名称(形参列表){ 对运算符的重载 } 注意函数名是由operator和运算符组成.在上面的一般格式中,operator是关键字,是专门用于重载运算符函 ...

  3. swfit:运算符重载 Operator Methods

    Operator Methods Classes and structures can provide their own implementations of existing operators. ...

  4. 《Inside C#》笔记(十一) 运算符重载

    运算符重载与之前的索引器类似,目的是为了让语言本身使用起来更方便直接,也是一种语法糖. 一 运算符重载(Operator Overloading) 运算符重载的存在,使得现有的各种运算符可以被重新定义 ...

  5. C++重载的奥义之运算符重载

    0.引言 重载,顾名思义从字面上理解就是重复装载,打一个不恰当的比方,你可以用一个篮子装蔬菜,也可以装水果或者其它,使用的是同一个篮子,但是可以用篮子重复装载的东西不一样. 正如在之前的文章<重 ...

  6. PoEduo - C++阶段班【Po学校】-Lesson03-5_运算符重载- 第7天

    PoEduo - Lesson03-5_运算符重载- 第7天 复习前面的知识点 空类会自动生成哪些默认函数 6个默认函数    1  构造  2  析构   3  赋值  4 拷贝构造  5 oper ...

  7. [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)

    operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...

  8. C++多态(二)——函数重载(overloading)和操作符重载

       任何函数都能重载. 一.普通函数的重载 C语言中一个函数只能处理一个类型的数据,不可能兼顾两种或多种数据类型:C++使用使用同一名称的函数来处理多个类型的数据. #include <ios ...

  9. C/C++对bool operator < (const p &a)const的认识,运算符重载详解(杂谈)

    下面来进行这段代码的分析: struct node {  //定义一个结构体node(节点)    int x;    int y;    int len;   //node中有3个成员变量x,y,l ...

  10. C++的拷贝构造函数、operator=运算符重载,深拷贝和浅拷贝、explicit关键字

    原文地址:https://blog.csdn.net/shine_journey/article/details/53081523 1.在C++编码过程中,类的创建十分频繁. 简单的功能,当然不用考虑 ...

随机推荐

  1. 记录--uni-app中安卓包检查更新、新版本下载、下载进度条显示功能实现

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 需求描述 如果想要做一个app的话,可以有很多种选择方案,uni-app是其中的一个性价比高一些(坑多一些)的方案.本文记录一下,uni- ...

  2. 记录--可视化大屏-用threejs撸一个3d中国地图

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 不想看繁琐步骤的,可以直接去github下载项目,如果可以顺便来个star哈哈 本项目使用vue-cli创建,但不影响使用,主要绘制都已封 ...

  3. 使用Go语言开发一个短链接服务:五、添加和获取短链接

    章节  使用Go语言开发一个短链接服务:一.基本原理  使用Go语言开发一个短链接服务:二.架构设计  使用Go语言开发一个短链接服务:三.项目目录结构设计  使用Go语言开发一个短链接服务:四.生成 ...

  4. springBoot打war包部署tomcat

    1.修改maven的pom.xml文件 <packaging>war</packaging> 2.排除springboot内嵌的tomcat <dependency> ...

  5. KingbaseES 的角色和权限管理

    KingbaseES使用角色的概念管理数据库访问权限.为了方便权限管理,用户可以建立多个角色,对角色进行授权和权限回收,并把角色授予其他用户. 数据库初始化时,会创建一个超级用户的角色:system( ...

  6. C++中结构体的各种用法,详细版

    C++中的结构体是一种用户自定义的数据类型,可以存储不同类型的数据成员.以下是一些结构体的常见用法: 1. 定义结构体类型 结构体类型的定义可以放在函数内部或外部,例如: ``` struct Per ...

  7. Scala 函数至简原则

    (1)return 可以省略,Scala 会使用函数体的最后一行代码作为返回值(2)如果函数体只有一行代码,可以省略花括号(3)返回值类型如果能够推断出来,那么可以省略(:和返回值类型一起省略)(4) ...

  8. #背包#洛谷 4026 [SHOI2008]循环的债务

    题目 分析 设\(dp[t][n][m]\)表示前\(t\)种钞票\(\text{Alice,Bob}\)分别拥有\(n,m\)元所需最小交换钞票数, 枚举\(\text{Alice,Bob}\)最后 ...

  9. Dev 控件 gridControl教程

    Dev 控件 gridControl教程:https://www.bilibili.com/video/BV1gz4y1R7Wk/?spm_id_from=333.788.recommend_more ...

  10. 历时 4 个月,CabloyJS 4.21震撼发布,应对大型项目开发

    引言 凡是可以用 JavaScript 来写的应用,最终都会用 JavaScript 来写 | Atwood 定律 目前市面上出现的大多数与 NodeJS 相关的框架,基本都将 NodeJS 定位在工 ...