在 C++ 中,左移运算符<<可以和 cout 一起用于输出,因此也常被称为“流插入运算符”或者“输出运算符”。实际上,<<本来没有这样的功能,之所以能和 cout 一起使用,是因为被重载了。

cout 是 ostream 类的对象。ostream 类和 cout 都是在头文件 中声明的。ostream 类将<<重载为成员函数,而且重载了多次。为了使cout<<"Star War"能够成立,ostream 类需要将<<进行如下重载:
复制纯文本复制

ostream & ostream::operator << (const char* s)
{//输出s的代码return * this;
}
ostream & ostream::operator << (const char* s)
{//输出s的代码return * this;
}

为了使cout<<5;能够成立,ostream 类还需要将<<进行如下重载:
复制纯文本复制

ostream & ostream::operator << (int n)
{//输出n的代码return *this;
}
ostream & ostream::operator << (int n)
{//输出n的代码return *this;
}

重载函数的返回值类型为 ostream 的引用,并且函数返回 *this,就使得cout<<“Star War”<<5能够成立。有了上面的重载,cout<<“Star War”<<5;就等价于:
( cout.operator<<(“Star War”) ).operator<<(5);

重载函数返回 *this,使得cout<<"Star War"这个表达式的值依然是 cout(说得更准确一点就是 cout 的引用,等价于 cout),所以能够和<<5继续进行运算。

cin 是 istream 类的对象,是在头文件 中声明的。istream 类将>>重载为成员函数,因此 cin 才能和>>连用以输入数据。一般也将>>称为“流提取运算符”或者“输入运算符”。

例题:假定 c 是 Complex 复数类的对象,现在希望写cout<<c;就能以 a+bi 的形式输出 c 的值;写cin>>c;就能从键盘接受 a+bi 形式的输入,并且使得 c.real = a, c.imag = b。

显然,要对<<和>>进行重载,程序如下:

#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
class Complex
{double real,imag;
public:Complex( double r=0, double i=0):real(r),imag(i){ };friend ostream & operator<<( ostream & os,const Complex & c);friend istream & operator>>( istream & is,Complex & c);
};
ostream & operator<<( ostream & os,const Complex & c)
{os << c.real << "+" << c.imag << "i"; //以"a+bi"的形式输出return os;
}
istream & operator>>( istream & is,Complex & c)
{string s;is >> s;  //将"a+bi"作为字符串读入, "a+bi" 中间不能有空格int pos = s.find("+",0);string sTmp = s.substr(0,pos); //分离出代表实部的字符串c.real = atof(sTmp.c_str());//atof库函数能将const char*指针指向的内容转换成 floatsTmp = s.substr(pos+1, s.length()-pos-2);   //分离出代表虚部的字符串c.imag = atof(sTmp.c_str());return is;
}
int main()
{Complex c;int n;cin >> c >> n;cout << c << "," << n;return 0;
}
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
class Complex
{double real,imag;
public:Complex( double r=0, double i=0):real(r),imag(i){ };friend ostream & operator<<( ostream & os,const Complex & c);friend istream & operator>>( istream & is,Complex & c);
};
ostream & operator<<( ostream & os,const Complex & c)
{os << c.real << "+" << c.imag << "i"; //以"a+bi"的形式输出return os;
}
istream & operator>>( istream & is,Complex & c)
{string s;is >> s;  //将"a+bi"作为字符串读入, "a+bi" 中间不能有空格int pos = s.find("+",0);string sTmp = s.substr(0,pos); //分离出代表实部的字符串c.real = atof(sTmp.c_str());//atof库函数能将const char*指针指向的内容转换成 floatsTmp = s.substr(pos+1, s.length()-pos-2);   //分离出代表虚部的字符串c.imag = atof(sTmp.c_str());return is;
}
int main()
{Complex c;int n;cin >> c >> n;cout << c << "," << n;return 0;
}

程序的运行结果:
13.2+133i 87
13.2+133i,87

const char *c_str();

c_str()函数返回一个指向正规C字符串的指针常量,
内容与本string串相同.(其实它指向的是string对象内部真正的char缓冲区),所以返回const,以防止用户的修改。
这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string
对象转换成c中的字符串样式。

因为没有办法修改 ostream 类和 istream 类,所以只能将<<和>>重载为全局函数的形式。由于这两个函数需要访问 Complex 类的私有成员,因此在 Complex 类定义中将它们声明为友元。

cout<<c会被解释成operator<<(cout, c),因此编写 operator<< 函数时,它的两个参数就不难确定了。

第 13 行,参数 os 只能是 ostream 的引用,而不能是 ostream 对象,因为 ostream 的复制构造函数是私有的,没有办法生成 ostream 参数对象。operator<< 函数的返回值类型设为 ostream &,并且返回 os,就能够实现<<的连续使用,如cout<<c<<5。在本程序中,执行第 34 行的cout<<c进入 operator<< 后,os 引用的就是 cout,因此第 34 行就能产生输出。

用 cin 读入复数时,对应的输入必须是 a+bi 的格式,而且中间不能有空格,如输入 13.2+33.4i。第 21 行的is>>s;读入一个字符串。假定输入的格式没有错误,那么被读入 s 的就是 a+bi 格式的字符串。

读入后需要将字符串中的实部 a 和虚部 b 分离出来,分离的办法就是找出被+隔开的两个子串,然后将两个字符串转换成浮点数。第 24 行调用了标准库函数 atof 来将字符串转换为浮点数。该函数的原型是float atof(const char *),它在 头文件中声明。

C++中 对》和《的重载相关推荐

  1. C++中逗号操作符的重载

    文章目录 1 C++中逗号操作符的重载 1.1 逗号操作符的原生语义 1.2 重载逗号操作符 1 C++中逗号操作符的重载 1.1 逗号操作符的原生语义 逗号操作符(,)可以构成逗号表达式: 逗号表达 ...

  2. C++中的逻辑操作符重载

    文章目录 1 C++中的逻辑操作符重载 1.1 逻辑操作符的原生语义 1.2 重载逻辑操作符 1.3 逻辑操作符重载的建议 1 C++中的逻辑操作符重载 1.1 逻辑操作符的原生语义 逻辑操作符的原生 ...

  3. C++中的赋值操作符重载

    文章目录 1 C++中的赋值操作符重载 1.1 赋值操作符重载 1 C++中的赋值操作符重载 1.1 赋值操作符重载 关于赋值操作符: 编译器为每个类默认重载了赋值操作符. 默认的赋值操作符仅完成浅拷 ...

  4. C++中函数调用操作符的重载

    文章目录 1 C++中函数调用操作符的重载 1.1 函数调用操作符的重载 1 C++中函数调用操作符的重载 1.1 函数调用操作符的重载 函数调用操作符的重载: 只能通过类的成员函数重载. 可以定义不 ...

  5. C++中左移操作符的重载

    文章目录 1 C++中左移操作符的重载 1 C++中左移操作符的重载 我们可以重载左移操作符,将变量或者常量左移到一个对象中! 示例代码: #include <stdio.h>const ...

  6. Golang中函数不支持重载

    Golang中函数不支持重载

  7. Java重载和重写6_深入理解Java中的重写和重载

    深入理解Java中的重写和重载 重载(Overloading)和重写(Overriding)是Java中两个比较重要的概念.但是对于新手来说也比较容易混淆.本文通过两个简单的例子说明了他们之间的区别. ...

  8. C#中如何利用操作符重载和转换操作符

    操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...

  9. [转载] Java中为什么要有重载现象

    参考链接: 重载Java中的main() Java中为什么要有重载现象. 一句话告诉你们"节约词汇". 我们先从生活中的例子来看. 打?你会想到什么.要看宾语是什么. 打球 打孩子 ...

  10. java 接口重载_java,_java 接口中如何声明类似于重载的方法?,java - phpStudy

    java 接口中如何声明类似于重载的方法? 我们的作业要写一个web宠物医院管理系统,因为医生.客户等都包含浏览.添加.删除操作,所以对于service层,我希望有个统一的接口以供servlet中的类 ...

最新文章

  1. Node.js Web 模块
  2. php麻将机器人ai算法,高性能麻将AI算法
  3. STL源码剖析---空间配置器
  4. Java判断字符串的开头和结尾
  5. crt中 新建的连接存储在哪_LCD发展至今仍然没有完胜CRT显示器,“老玩家”为你现身说法...
  6. [bzoj3625][Codeforces 250 E]The Child and Binary Tree(生成函数+多项式运算+FFT)
  7. 在Java中使用Google的协议缓冲区
  8. fluent 命令流_FLUENT混合流体中颗粒运动模拟
  9. 注解@CrossOrigin详解
  10. Symantec Backup Exec 2012修改显示语言
  11. ELK日志管理系统图示全过程详解
  12. SKU与SPU的区别与联系
  13. 2021年电赛仪器仪表类重难点
  14. hibernate查询的方式 都有哪些
  15. 重庆云阳2021云中高考成绩查询,2021年云阳县高考状元是谁及其成绩名单
  16. java基于quasar实现协程池【后篇】
  17. 学习一下windows系统的的目录结构,对比一下Linux系统的目录结构
  18. Sailfish应用开发入门(二)Sailfish SDK 简介
  19. 2、java语言基础
  20. 计算机网络及相关设备的维护,网络设备管理与维护--详细介绍

热门文章

  1. 【毕业设计】后端实现——设计数据库并存储数据
  2. python爬虫后进行诗词接龙_诗词,名人名言接龙分诗词组,名人名言组,进行关于成败的接龙比赛就是用诗词接龙,名人名言接龙,都必须是关于成败的你们知道接...
  3. Sea of nodes 中译文
  4. Win10 UWP应用发布流程
  5. L1-057 PTA使我精神焕发 - java
  6. 【数据科学】5个数据讲故事技巧,用于创建更有说服力的图和表
  7. VC字符串与时间戳相互转换
  8. 模式识别笔记(一)概论、贝叶斯决策(参数估计、非参数估计)
  9. 摄像头参数介绍 ———— 信噪比(SNR)
  10. django进阶11 聚合查询 Q