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

第九周C++任务三。定义分数类中<<和>>运算符重载,实现分数的输入输出 【任务3】接第8周任务3,定义分数类中>运算符重载,实现分数的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然。     #include using namespace std; class CFraction { private: int nume; // 分子 int deno; // 分 阅读详情

为什么要重载 << 和 >>

为了更方便的实现复杂对象的输入和输出。


<< 输出运算符重载

他有两种方式:

  1. 使用成员函数(不推荐,该方式没有实际意义,在这里就不代码演示了)
    2. 使用友元函数(极力推荐使用该方式)

使用友元函数重载输出运算符 <<

需求:

  1. 定义Boy类,Boy类实现输出运算符重载,且使用友元方式;
  2. 根据Boy类,定义出对象boy1,并赋值Boy boy1(“张三”, 34, 50000);
  3. 使用友元方式的输出运算符重载输出boy1。

代码示例:

Boy.h

#pragma
#include <iostream>

using namespace std;

class Boy {
public:
	Boy(const char *name=NULL, int age=0, int salary=0);
	~Boy();

private:
	char *name;
	int age;
	int salary;

	// 输出运算符函数 声明为友元
	friend ostream &operator<<(ostream &os, Boy &boy);
};

// 函数声明
ostream &operator<<(ostream &os, Boy &boy);

Boy.cpp

#include "Boy.h"

Boy::Boy(const char *name, int age, int salary) {
	if (name == NULL) {
		name = "无名";
	}

	this->name = new char[strlen(name)+1];
	strcpy_s(this->name, strlen(name)+1, name);

	this->age = age;
	this->salary = salary;
}

Boy::~Boy() {
	if (name) {
		delete[] name;
	}
}

// 函数实现
ostream &operator<<(ostream &os, Boy &boy) {
	os << "姓名:" << boy.name << "\t年龄:" << boy.age << "\t薪资:" << boy.salary;
	return os;
}

main

#include "Boy.h"

// 需求:
/*	1.定义Boy类,Boy类实现输出运算符重载,且使用友元方式;
 *	2.根据Boy类,定义出对象boy1,并赋值Boy boy1("张三", 34, 50000);
 *	3.使用友元方式的输出运算符重载输出boy1.
*/

int main(void) {
	Boy boy1("张三", 34, 50000);

	// boy.operator(cout);
	cout << boy1 << endl;

	system("pause");
	return 0;
}

运行截图:

在这里插入图片描述


>> 输入运算符重载

与输出运算符重载大同小异,这里也是使用友元函数来实现

需求:

  1. 定义Boy类,Boy类实现输入运算符重载,且使用友元方式;
  2. 根据Boy类,定义出对象boy2,但不赋值 Boy boy2;
  3. 给boy2输入数据:“李四” 36 55000;
  4. 输出boy2的值。

代码示例:

Boy.h

#pragma
#include <iostream>

using namespace std;

class Boy {
public:
	Boy(const char *name=NULL, int age=0, int salary=0);
	~Boy();

private:
	char *name;
	int age;
	int salary;

	// <<输出运算符函数 声明为友元
	friend ostream &operator<<(ostream &os, Boy &boy);

	// >>输入运算符函数 声明为友元
	friend istream &operator>>(istream &in, Boy &boy);
};

// 输出<< 函数声明
ostream &operator<<(ostream &os, Boy &boy);

// 输入>> 函数声明
istream &operator>>(istream &in, Boy &boy);

Boy.cpp

#include <string>
#include "Boy.h"

Boy::Boy(const char *name, int age, int salary) {
	if (name == NULL) {
		name = "无名";
	}

	this->name = new char[strlen(name)+1];
	strcpy_s(this->name, strlen(name)+1, name);

	this->age = age;
	this->salary = salary;
}

Boy::~Boy() {
	if (name) {
		delete[] name;
	}
}

// 输出 << 函数实现
ostream &operator<<(ostream &os, Boy &boy) {
	os << "姓名:" << boy.name << "\t年龄:" << boy.age << "\t薪资:" << boy.salary;
	return os;
}

// 输入 >> 函数实现
istream &operator>>(istream &in, Boy &boy) {
	// 原理分析:
	// 因为还不知道会输入多少字节给指针name,
	// 所以不能直接输入:in >> boy.name >> boy.age >> boy.salary;	// error
	// 所以得定义一个c++类型的字符串输入值后,再计算出他的长度,
	// 再分配对应的字节长度的内存给指针name,最后再把Name 拷贝 给 name。
	string Name;

	in >> Name >> boy.age >> boy.salary;

	// 如果boy.name中原本有内存,那么就释放掉
	if (boy.name) {
		delete[] boy.name;
	}

	// 计算出Name一共有多少个字节,再加一(加一字节给回车符)
	int line = strlen(Name.c_str())+1;

	boy.name = new char[line];
	strcpy_s(boy.name, line, Name.c_str());

	return in;
}

main

#include "Boy.h"

// 需求:
/*	1.定义Boy类,Boy类实现输入运算符重载,且使用友元方式;
 *	2.根据Boy类,定义出对象boy2,但不赋值 Boy boy2;
 *	3.给boy2输入数据:"李四" 36 55000; 
 *	4.输出boy2的值。
 */

int main(void) {
	//Boy boy1("张三", 34, 50000);

	//// boy.operator(cout);
	//cout << boy1 << endl;

	Boy boy2;

	cout << "请输入boy2的值:" << endl;
	cin >> boy2;

	cout << boy2 << endl;

	system("pause");
	return 0;
}

运行截图:

在这里插入图片描述


注意:

1.使用 istream 和 ostream 必须包含头文件 #include < iostream >
2.operator关键字 必须使用std:: 修饰(声明命名空间也可以:using namspace std;)


总结:

输出<< 运算符重载个人感觉比较实用,学会了以后在工作中可能会用到。

C++重载输入和输出运算符 在C++中,标准库本身已经对左移运算符分别进行了重载,使其能够用于不同数据的输入输出,但是输入输出的对象只能是 C++ 内置的数据类型(例如 bool、int、double 等)和标准库所包含的类类型(例如 string、complex、ofstream、ifstream 等)。如果我们自己定义了一种新的数据类型,需要用输入输出运算符去处理,那么就必须对它们进行重载。本节以前面的 complex 类为例来演示输入输出运算符的重载。 阅读详情

相关推荐

Vue2项目实战:vue2-org-tree实现动态组织架构图

本文详细介绍了如何在Vue2项目中使用vue2-org-tree组件实现动态、可交互的组织架构图。内容涵盖从快速安装、基础渲染到核心功能实战,包括水平布局、节点展开折叠、响应式数据绑定、深度自定义节点内容以及事件处理。同时提供了性能优化、样式覆盖等避坑指南,并通过一个完整的企业级Demo展示了如何打造功能丰富的架构图,助力高效开发后台管理系统。

weixin_28040125的博客 522

C++ 语言重载运算符 - 输入和输出运算符

C++ 语言重载运算符 - 输入和输出运算符 IO 标准库分别使用 >> 和 << 执行输入和输出操作,IO 库定义了用其读写内置类型的版本,而类则需要自定义适合其对象的新版本以支持 IO 操作。 1. 重载输出运算符 << 通常情况下,输出运算符的第一个形参是一个非常量 std::ostream 对象的引用。std::ostream 是非常量,因为向流写入内容会改变其状态。该形参是引用,因为我们无法直接复制一个 std::ostream 对象。 第二个形参一般来说是一个

程永强 4881

内存|内存的概念、内存的作用、内存的物理结构及内存使用

内存是硬件,是用于存放数据的硬件。程序执行前需要先放到内存中才能被CPU处理。内存是与CPU沟通的桥梁,计算机中所有程序的运行都要依靠内存,内存对计算机的影响非常大。本文简单介绍了内存的概念、作用、物理结构以及使用,内存远不止如此,后续文章会逐步深入讲解。

qq_59938293的博客 2万+

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

一、为什么要重载输入输出运算符 平时可以用流 std::cout<<str<<n ; std::cin>>str>>n ; 输出、输入字符串和整型等。但是对于自定义的类,比如 Student 类,却不能直接通过 cout<<Student 或 cin>>Student 这样的形式来输出类的内容或给类赋值。为了让自定义的类也支...

love、reading的博客 7494

公文流转系统

公文录入区 | QLineEdit(文号/标题)、QComboBox(公文类型/紧急程度)、QTextEdit(正文)、QListWidget(附件列表)、QPushButton(上传附件/保存草稿/提交审批) |// 按时间范围获取。QStringList userNames = {"张三", "李四", "王五", "赵六", "钱七", "孙八", "周九", "吴十", "郑十一", "王十二"};

寒寒豆豆软件公司的博客 550

【小程序抓取】解决痛点:如何用 AI-RPA 工具抓取无法获取 URL 的微信小程序数据?

本文探讨了传统爬虫技术在微信小程序数据采集中的局限性,并提出了AI-RPA(人工智能驱动的机器人流程自动化)这一前沿解决方案。随着微信小程序安全防护体系的全面升级(包括证书锁定、加密传输和三级防御机制),传统"抓包-模拟请求"的方式已基本失效。文章对比了Reqable、Fiddler等主流抓包工具的优劣,通过某程旅行小程序案例展示了传统抓包的技术流程和动态参数处理的难点。最终指出,2026年最有效的解决方案是采用AI-RPA技术,通过视觉识别、鼠标键盘模拟、OCR和AI智能体编排的组合方案,直接从小程序UI

ZDQ58818的博客 124

标准C++day6——输入输出及运算符重载

输入输出运算符 单目和自变运算符 特殊的运算符重载 重载运算符的限制

weixin_51479108的博客 461

Linux下搭建简易的HTTP服务器完成图片显示

篇文章作为Linux下socket(TCP)网络编程的练习,使用C语言代码搭建一个简单的HTTP服务器,完成与浏览器之间的交互,最终在浏览器上显示一张图片;通过这个例子可以巩固socket里多线程使用,也可以方便学习了解HTTP协议。

2588

C++重载<<和>>(输入输出运算符)

在C++中,系统已经对左移右移运算符分别进行了重载,使其能够用于输入输出,但是输入输出的处理对象只能是系统内建的数据类型。系统重载这两个运算符是以系统类成员函数的形式进行的,因此: cout 如果自定义了一种新的数据类型,需要用输入输出运算符去处理,那么就要重载。 重载输入运算符: 下面用全局函数的形式重载输入运算符,使它能够读入两个double类型的数据,并转换为一个复数,保存到复数对象

小凡的专栏 3767

模拟量输入功能块 S_ITR(Easy系列PLC完整ST源代码)

IN Input INT 输入数字量 1IN ISH INT 输入数字量上限 2IN ISL INT 输入数字量下限 3IN OSH REAL 输出工程量上限 4IN OSL REAL 输出工程量下限 5OUT OUTPUT REAL 输出工程量 6VAR temp1 REAL 临时变量1 7VAR temp2 REAL 临时变量2 8。

RXXW_Dor的博客 716

3、固定翼无人机模型解析

本文详细解析了固定翼无人机的动力学模型与纵向模型,涵盖位置、速度、角度及角速度的变化率方程,并介绍了力和力矩的计算方法以及气动系数的表达式。通过关键参数分析,探讨了速度、迎角和倾斜角对飞行性能的影响。文章还展示了模型在编队飞行和任务规划中的应用,并提出了参数优化与先进控制策略等优化思路,为无人机飞行控制系统设计提供了理论基础。

gaochao的博客 240

C++输入输出运算符重载(cout与ostream)

描述输入输出运算符重载方法,输入输出逻辑相同,所以以输出为主,描述重点在输出运算符重载函数的形参(简单说下cout与ostream)、返回值类型以及形参位置,(参考c++参考手册)

Il_l_Il的博客 3865

初识数据之特征选择

【代码】初识数据之特征选择。

M_inherit的博客 1134

C++重载>>和<<(输入和输出运算符)详解

C++重载>>和<<(输入和输出运算符)详解 在C++中,标准库本身已经对左移运算符<<和右移运算符>>分别进行了重载,使其能够用于不同数据的输入输出,但是输入输出的对象只能是 C++ 内置的数据类型(例如 bool、int、double 等)和标准库所包含的类类型(例如 string、complex、ofstream、ifstream 等)。 如果我们自己定义了一种新的数据类型,需要用输入输出运算符去处理,那么就必须对它们进行重载。本节以前面的 comple

ccc369639963的博客 7598

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C++重载输出运算符”<<”和输入运算符”>>”

在 C++中,左移运算符

u013441358的专栏 1549

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【C++】重载运算与类型转换(二):重载输入和输出运算符

对 C++ Primer 第五版第十四章第二节:重载输入和输出运算符进行阅读学习和记录。

YGGP的博客 405

C++重载>>和<<输入和输出运算符)

在C++中,标准库本身已经对左移运算符<<和右移运算符>>分别进行了重载,使其能够用于不同数据的输入输出,但是输入输出的对象只能是 C++ 内置的数据类型(例如 bool、int、double 等)和标准库所包含的类类型(例如 string、complex、ofstream、ifstream 等)。 如果我们自己定义了一种新的数据类型,需要用输入输出运算符去处理,那么就必须对它们进行重载。本节以前面的 complex 类为例来演示输入输出运算符的重载。 其实 C++ 标准库已经提供了

luoganttcc的博客 279

matlab 运算符 重载,C++重载<<和>>(C++重载输出运算符和输入运算符)

在 C++ 中,左移运算符<cout 是 ostream 类的对象。ostream 类和 cout 都是在头文件 中声明的。ostream 类将<ostream & ostream::operator << (const char* s){//输出s的代码return * this;}为了使cout<<5;能够成立,ostream 类还需要将<o...

weixin_35300124的博客 300

C++学习3:C++输入/输出(<<和>>)运算符重载

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

944

C++学习28 重载>>和<<(输入输出运算符)

在C++中,系统已经对左移运算符“<<”和右移运算符“>>”分别进行了重载,使其能够用于输入输出,但是输入输出的处理对象只能是系统内建的数据类型。系统重载这两个运算符是以系统类成员函数的形式进行的,因此cout<< var语句可以理解为: cout.operator<<( var ) 如果我们自己定义了一种新的数据类型,需要用输...

dengaoxin0873的博客 272

C++Primer : 第十四章 :重载输入和输出运算符

重载输出运算符<< 通常情况,输入运算符的第一个形参是一个非常量ostream对象的引用。之所以ostream是非常量是因为向流写入内容会改变其状态;而该形参的引用是因为我们无法直接复制一个ostream对象。 第二个形参一般来说是一个常量的引用,该常量是我们想要打印的类类型。第二个形参是引用的原因是我们希望避免复制实参;而之所以该形参可以是常量是因为打印对象不会改变对象的内容。 为了...

CLZHIT的博客 412

C++:重载>>和<<(输入和输出运算符)

这其中istream表示输入流,cin是istream类的对象;ostream是输出流,cout是ostream类的对象。

2301_80311224的博客 297

【C++基础】第七十六课:[重载运算与类型转换]输入和输出运算符

【C++基础】系列博客为参考)一书,自己所做的读书笔记。

qq_34222839的博客 931

C++重载>>和<<(输入输出运算符)

在C++中,标准库本身已经对左移运算符<<和右移运算符>>分别进行了重载,使其能够用于不同数据的输入输出,但是输入输出的对象只能是 C++ 内置的数据类型(例如 bool、int、double 等)和标准库所包含的类类型(例如 string、complex、ofstream、ifstream 等)。如果我们自己定义了一种新的数据类型,需要用输入输出运算符去处理,那么就必须对...

weixin_30555515的博客 218
上一篇: C++ 类型运算符重载
下一篇: C++11 final 与 override 的用法
cpp_learners
博客等级 码龄7年 1526粉丝 274原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值