C++多态与虚拟:运算符重载(Operator Overloading)

这篇具有很好参考价值的文章主要介绍了C++多态与虚拟:运算符重载(Operator Overloading)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  运算符重载:与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,虽然也能读出字符,但空格会被忽略,这个并非我们所想要的。文章来源地址https://www.toymoban.com/news/detail-858115.html

到了这里,关于C++多态与虚拟:运算符重载(Operator Overloading)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】详解运算符重载,赋值运算符重载,++运算符重载

    目录 前言 运算符重载 概念 目的 写法 调用 注意事项 详解注意事项 运算符重载成全局性的弊端 类中隐含的this指针 赋值运算符重载 赋值运算符重载格式 注意点 明晰赋值运算符重载函数的调用 连续赋值 传引用与传值返回 默认赋值运算符重载 前置++和后置++重载 先梳理一下

    2024年04月25日
    浏览(56)
  • C# 类class、继承、多态性、运算符重载,相关练习题

    34.函数重载 35.几个相同的函数  print() ,用于打印不同的数据类型。   36.基类和派生类   37.基类的初始化   38.多重继承   39.动态多态性   40.抽象性和虚方法   41.通过虚方法 area() 来计算不同形状图像的面积   42.运算符重载的实现   @www.runoob.com 

    2024年02月09日
    浏览(31)
  • 【C++】运算符重载案例 - 字符串类 ⑤ ( 重载 大于 > 运算符 | 重载 小于 < 运算符 | 重载 右移 >> 运算符 - 使用全局函数重载 | 代码示例 )

    使用 成员函数 实现 等于判断 == 运算符重载 : 首先 , 写出函数名 , 函数名规则为 \\\" operate \\\" 后面跟上要重载的运算符 , 要对 String a , b 对象对比操作 , 使用 大于 运算符 , 使用时用法为 a b ; 函数名是 operate ; 然后 , 根据操作数 写出函数参数 , 参数一般都是 对象的引用 ; 要对

    2024年02月07日
    浏览(34)
  • C++,运算符重载——关系运算符练习

    一、关系运算符重载 = = == !=  二、知识点整理  

    2024年02月11日
    浏览(32)
  • C++——运算符重载

    运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。 运算符重载的目的是让语法更加简洁 运算符重载不能改变本来寓意,不能改变基础类型寓意 运算符重载的本质是另一种函数调用(是编译器去调用) 这个函数统一的名字叫opera

    2024年02月16日
    浏览(37)
  • 【C++】运算符重载

    目录 1. 基本概念 1.1 直接调用一个重载的运算符函数 1.2 某些运算符不应该被重载 1.3 使用与内置类型一致的含义 1.4 赋值和复合赋值运算符 1.5 选择作为成员或者非成员 2. 输入和输出运算符 2.1 输出运算符重载 2.2 输入运算符重载 3. 算术和关系运算符 3.1 算数运算符重载 3.2

    2024年02月11日
    浏览(35)
  • C++:重载运算符

    1.重载不能改变运算符运算的对象个数 2.重载不能改变运算符的优先级别 3.重载不能改变运算符的结合性 4.重载运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应该有一个是类对象,或类对象的引用 5.重载运算符的功能要类似于该运算符作用于标准类型数据

    2024年02月10日
    浏览(35)
  • 复习 --- C++运算符重载

    .5 运算符重载 运算符重载概念:对已有的运算符重新进行定义,赋予其另外一种功能,以适应不同的数据类型 4.5.1 加号运算符重载 作用:实现两个自定义数据类型相加的运算 4.5.2 左移运算符重载 4.5.3递增运算符重载 作用:通过重载递增运算符,实现自己的整型数据 4.5.4 赋

    2024年02月07日
    浏览(34)
  • C++——类和对象3|日期类型|Cout运算符重载|Cin运算符重载|const成员|

    目录 日期类型  Date.h  Date.cpp  Test.cpp  实现Cout运算符重载  实现Cin运算符重载  根据日期算星期  修改后完整代码   Date.h  Date.cpp  const成员  取地址及const取地址操作符重载 习题  计算日期到天数转换     一个类到底可以重载哪些运算符,要看哪些运算符对这个类型有

    2023年04月13日
    浏览(48)
  • C++中重载相等运算符 ==

    相等运算(==)是一种关系运算,与不等运算(!=)关系密切。 通常情况下,C++ 中的类通过定义相等运算符来检验两个对象是否相等。也就是说它们会比较对象的每一个数据成员,只有当所有对应的 成员都相等时才认为两个对象相等。依据这一思想,我们的 Sales_data 类的相等

    2024年02月12日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包