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

为了与IO标准库一致,重载输入输出运算符函数的第一个行参应该是流的引用,第二个行参是对象的引用。

如果重载为类的成员函数,第一个行参应该是对象的引用,第二个行参是流的引用。

使用方式是 ClassObj << cout
这样与标准IO库就不一致了,所以输入输出运算符不能重载为类的成员函数,可以重载为类的友元函数和普通函数。

通常重载输出运算符的第二个行参是const的,因为输出一个类不许要更改它;

但是重载输入运算符的第二个行参必须是非const的,否则无法赋值。

重载的基本方法如下:


//重载输出运算符
ostream& operator<<(ostream& out, const ClassType& obj)
{
out << /*想要输出的内容1*/ << /*想要输出的内容2*/ <<...;
return out;
}

//重载输入运算符
istream& operator<<(istream& in, ClassType& obj)
{
in >> /*想要输入的内容1*/ >> /*想要输入的内容2*/ >>...;
//检查错误 和 文件结束的可能性
return in;

例子:类Persion使用友元函数的方式重载了输入输出运算符,类PersionA使用了普通函数重载了输入输出运算符。


#include <cstring>
#include <iostream>
using namespace std;

class Persion
{
public:
//constructor
Persion(const char *pname, unsigned int ag, double he,double we):age(ag),height(he),weight(we){strcpy(name,pname);}

//operator overload : <<
friend ostream& operator<<(ostream& out, const Persion& ref)
{
out<<ref.name<<"\t"<<ref.age<<"\t"<<ref.height<<"\t"<< ref.weight;
return out;
}
//operator overload : >>
friend istream& operator>>(istream& in, Persion& ref)
{
char name[40] = {0};
unsigned int ag = 0;
double he = 0;
double we = 0;

in>>name>>ag>>he>>we;

//check that if the inputs succeeded
if (in)
{//Input Succeeded
strcpy(ref.name, name);
ref.age = ag;
ref.height = he;
ref.weight = we;
}
else
{//Input Failed
}

return in;
}
private:
char name[40];
unsigned int age;
double height;
double weight;
};

class PersionA
{
public:
//constructor
PersionA(const char *pname, unsigned int ag, double he,double we):age(ag),height(he),weight(we){strcpy(name,pname);}
//GetData
char* GetName(void){return name;}
unsigned int& GetAge(void){return age;}
double& GetHeight(void){return height;}
double& GetWeight(void){return weight;}

private:
char name[40];
unsigned int age;
double height;
double weight;
};

//operator overload : <<
ostream& operator<<(ostream& out, PersionA& ref)
{
out<<ref.GetName()<<"\t"<<ref.GetAge()<<"\t"<<ref.GetHeight()<<"\t"<<ref.GetWeight();
return out;
}
//operator overload : >>
istream& operator>>(istream& in, PersionA& ref)
{
char name[40] = {0};
unsigned int ag = 0;
double he = 0;
double we = 0;

in>>name>>ag>>he>>we;

//check that if the inputs succeeded
if (in)
{//Input Succeeded
strcpy(ref.GetName(), name);
ref.GetAge() = ag;
ref.GetHeight() = he;
ref.GetWeight() = we;
}
else
{//Input Failed
}

return in;
}
int main(void)
{
Persion per("Jack", 20, 175, 65);
cout << per << endl;
cin>>per;
cout << per << endl;

PersionA perA("Jack", 20, 175, 65);
cout << perA << endl;
cin>>perA;
cout << perA << endl;
return 0;
}

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

时间: 2024-10-18 18:24:01

C++运算符重载——输入/输出运算符的相关文章

C++ Primer笔记10_运算符重载_赋值运算符_输入/输出运算符

我们致力于推广Scriptcase,以产品销售.技术支持.培训服务.外包开发为核心,将Scriptcase这一简单易用的工具真正在国内予以推广.我们搭建了Scriptcase的示例网站,通过该网站可以看到在几乎不需要任何编程的情况下,Scriptcase可以做到如何快速和先进的开发. 敬请访问 www.phpscriptcase.com C++ Primer笔记10_运算符重载_赋值运算符_输入/输出运算符

C++ Primer 学习笔记_27_操作符重载与转换(2)--++/--运算符重载、!运算符重载、赋值运算符重载 、String类([]、 +、 += 运算符重载)、&gt;&gt;和&lt;&lt;运算符重载

C++ Primer 学习笔记_27_操作符重载与转换(2)--++/--运算符重载.!运算符重载.赋值运算符重载 .String类([]. +. += 运算符重载).>>和<<运算符重载 一.++/--运算符重载 1.前置++运算符重载 成员函数的方式重载,原型为: 函数类型 & operator++(); 友元函数的方式重载,原型为: friend 函数类型 & operator++(类类型 &); 2.后置++运算符重载 成员函数的方式重载,原型为:

c++运算符重载,输出符号重载

运算符有单目运算符和双目运算符,分别跟一个操作数和两个操作数.在c++里面无论是那种他们都可以操作多种类型的的变量,例如+运算符a+b,a,b既可以是整型,也可以是浮点型(float),编译器有一张符号表保存了a,b的类型(可以自己去看编译原理),当编译器在翻译a+b时根据其类型调用相应子程序处理.有时候我们觉得a,b的类型不够,这个时候,我们就可以重载+,比如我们想实现   classA+classB,我们就可以重载+,返回值 operator+(classA a,classB& b){ 要干

第十七周oj刷题——Problem A: 实现复数类中的加运算符重载【C++运算符重载】

Description int家有i1和i2弟兄俩,小手一拉i1+i2,加起来了:double家有d1和d2姐妹俩,小手也一拉,d1+d2,也加起来了.C++村子里来了复数(Complex)一家子,也有俩兄弟c1和c2,想要来个累加,笨乎乎地,c1.add(c2).c1和c2伤心极了,也想像其他小朋友一样,小手一拉,c1+c2,也能加起来.这个任务交给了正在看题的魔术师,帮他们一个忙,让复数也能用+号相加吧.(可以复制提示部分的代码开始你的编程) Input 四个数,分别代表两个虚数c1和c2的

C#运算符重载和转换运算符实例(两个结构)

struct Celsius { private float degrees; public float Degrees { get { return this.degrees; } } public Celsius(float temp) { this.degrees = temp; Console.WriteLine("这是摄氏温度的构造!"); } public static Celsius operator +(Celsius x, Celsius y)//重载+运算符 { r

关于c++的运算符重载那些事

搞c++有一段时间了,今天突然要重载一个运算符,发现自己有点忘了,遂查查资料做一下c++运算符重载的小总结. 一.何为运算符重载 运算符的重载是c++语言特有的,java什么的是没有运算符重载的,所以运算符重载在笔试面试中有可能成为c++的高频考点.运算符重载就是重新定义运算符的意义,如常用的+,-,×,÷都是可以重载的.运算符重载使用的是关键字operator,表现形式是:                                                            

C++笔记(3):运算符重载

运算符重载 1.运算符重载基础 2.运算符重载的规则 3.重载双目运算符 4.重载单目运算符 5.重载流插入和提取运算符 6.类型转换 7.定义自己的string类 ------------------------------------------------------------------------------------------------------------------------------- 1.运算符重载基础 运算符重载就是对已有的运算符赋予新的含义,实现新的功能.前

sdut 4-1 复数类的运算符重载

4-1 复数类的运算符重载 Time Limit: 1000MS Memory limit: 65536K 题目描述 通过本题目的练习可以掌握成员运算符重载及友元运算符重载 要求定义一个复数类,重载加法和减法运算符以适应对复数运算的要求,重载插入运算符(<<)以方便输出一个复数的要求. 输入 要求在主函数中创建对象时初始化对象的值. 输出 输出数据共有4行,分别代表a,b的值和它们求和.求差后的值 示例输入 无 示例输出 a=3.2+4.5i b=8.9+5.6i a+b=12.1+10.1i

4-1复数类的运算符重载(SDUTOJ2677)

http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2677&cid=1275 题目描述 通过本题目的练习可以掌握成员运算符重载及友元运算符重载 要求定义一个复数类,重载加法和减法运算符以适应对复数运算的要求,重载插入运算符(<<)以方便输出一个复数的要求. 输入 要求在主函数中创建对象时初始化对象的值. 输出 输出数据共有4行,分别代表a,b的值和它们求和.求差后的值 示例输入 无 示例输出 a=3.2+4.5i b=8.9+5.6i