输入输出流

1.输入输出流

输入/输出流类:iostream---------i input(输入) o output(输出) stream:流

iostream:

istream类:输入流类-------------cin:输入流类的对象

ostream类:输出流类------------cout:输出流类的对象

1.1 输入流 istream

1.1.1 基本认识

数据是从键盘或显示器流向输入缓冲区中,最后刷新了再流向内存

istream实例化了cin对象 , 重载了运算符:>>

cpp 复制代码
输入格式:
		cin>>变量1;
		cin>>变量1>>变量2>>变量3.........;
	原型:
		istream &cin >>基本的数据类型;
		istream &cin >>int;
		istream &cin >>char;
		.......

1.1.2 重点

如果需要一次性输入多个数据,那么多个数据需要用空格进行间隔,另外需要输入回车,把输入的内容刷新到内存中

1.1.3 举例

iostream.cpp
cpp 复制代码
// 输入流
int main()
{
	int number;
	int number2;
	cout << "请输入两个数字" << endl;

	cin >> number >> number2;

	cout << "number=" <<number<<"  number2"<<number2 << endl;

	return 0;
}

1.2 输出流 ostream

数据是从内存流向输出缓冲区,刷新时再从输出缓冲区流向终端或显示器

缓冲区的大小:

#define BUFSIZ 512个字节

查看缓冲区大小

iostream.cpp

cpp 复制代码
#include "iostream"
using namespace std;

int main()
{
	cout << "缓冲区大小:" << BUFSIZ << endl;//查看缓冲区大小

	return 0;
}

1.2.1 基本认识

ostream实例化了cout对象、cerr对象(发生一些错误就会调用cerr输出错误信息)、clog对象(输出一些日志信息)

重载了运算符:<<

cpp 复制代码
输出格式:
		cout<<数据1;
		cout<<数据1<<数据2<<数据3,........;

原型

cpp 复制代码
	ostream类中:
		ostream &  operator  <<(int)//重载int类型
		{
			ostream cout;
			.....
			return  cout;
		}
		ostream &  operator  <<(char)//重载char类型
		{
		}

ostream &cout << 基本的数据类型;

ostream &cout << int ;

ostream &cout << char;

ostream &cout << unsigned int;

ostream &cout << char *;

ostream &cout << const char *;

ostream &cout << float;

.........

举例采用格式化输出

C语言的格式化输出也支持:\n、\r、.......

十进制形式输出:<iomanip>

dec:十进制

oct:八进制

hex:十六进制

....

iostream.cpp

cpp 复制代码
#include "iostream"
using namespace std;

//输出流
int main()
{
	cout << "缓冲区大小:" << BUFSIZ << endl;//查看缓冲区大小
	
	cerr << "hello world" << endl;
	cout << "\n" << endl;

	cout << dec << 17 << endl;
	cout << oct << 17 << endl;
	cout << hex << 17 << endl;

	clog << "你好,世界" << endl;

	cout << "hello" << 10 << 10.5 << 'a' << endl;

	return 0;
}

1.2.2 使输出流重载我们的字节定义的类型people试试

iostream.cpp
cpp 复制代码
// 使输出流重载我们的字节定义的类型people试试
class People {
public:
	People(int a, char b, double c)
	{
		this->a = a;
		this->b = b;
		this->c = c;
	}
	int a;
	char b;
	double c;
};

//重载输出流运算符  <<  ,使他可以输出我们自定义类型
void operator <<(ostream& out, People& people)
{
	out << people.a << endl;
	out << people.b << endl;
	out << people.c << endl;

}

int main()
{
	//实例化对象
	People people(10, 'v', 50.4);
	//输出(在我们没有重载前是不能输出people类型的)
	cout << people;

	return 0;
}
复制代码
// 使输出流重载我们的字节定义的类型people试试`
`class` `People` `{`
`public:`
	`People(int a,` `char b,` `double c)`
	`{`
		`this->a = a;`
		`this->b = b;`
		`this->c = c;`
	`}`
	`int a;`
	`char b;`
	`double c;`
`};`

`//重载输出流运算符  <<  ,使他可以输出我们自定义类型`
`void` `operator` `<<(ostream& out, People& people)`
`{`
`	out << people.a << endl;`
`	out << people.b << endl;`
`	out << people.c << endl;`

`}`

`int` `main()`
`{`
	`//实例化对象`
`	People people(10,` `'v',` `50.4);`
	`//输出(在我们没有重载前是不能输出people类型的)`
`	cout << people;`

	`return` `0;`
`}`
`

1.2.3 重点:

1)当输出遇到endl时,会刷新输出缓冲区

2)当流对象使用完或超出作用域时,也会刷新输出缓冲区

3)当输出缓冲区装满时,也会刷新一次缓冲区

1.3 总结

cpp 复制代码
#include <iostream>  
#include<string>  
#include <iomanip> //不要忘记包含此头文件  
using namespace std;  
int main()  
 {   
   int a;  
   cout<<"input a:";  
   cin>>a;  
   cout<<"dec:"<<dec<<a<<endl; //以上进制形式输出整数  
   cout<<"hex:"<<hex<<a<<endl; //以十六进制形式输出整数a  
   cout<<"oct:"<<setbase(8)<<a<<endl;//以八进制形式输出整数a  
   string pt= "China";         //pt指向字符串"China"  
   cout<<setw(10)<<pt<<endl; //指定域宽为10,输出字符串  
   cout<<setfill('*')<<setw(10)<<pt<<endl;//指定域宽10,输出字符串,空白处以"*"填充  
   double pi=22.0/7.0; //计算pi值  
   cout<<setiosflags(ios::scientific)<<setprecision(8);//按指数形式输出,8位小数  
   cout<<"pi="<<pi<<endl; //输出pi值  
   cout<<"pi="<<setprecision(4)<<pi<<endl;//改为4位小数  
   cout<<"pi="<<setiosflags(ios::fixed)<<pi<<endl;//改为小数形式输出,精度为4   
   cout<<"pi="<<fixed<<pi<<endl;//fixed确定小数点后精度为4   



cout.setf(ios::showbase); //设置输出时的基数符号  
   cout<<"dec:"<<a<<endl; //默认以十进制形式输出a  
   cout.unsetf(ios::dec); //终止十进制的格式设置  
   cout.setf(ios::hex); //设置以十六进制输出的状态  
   cout<<"hex:"<<a<<endl; //以十六进制形式输出a  
   cout.unsetf(ios::hex); //终止十六进制的格式设置  
   cout.setf(ios::oct); //设置以八进制输出的状态  
   cout<<"oct:"<<a<<endl; //以八进制形式输出a  
   cout.unsetf(ios::oct); //终止以八进制的输出格式设置  
   char *pt="China"; //pt指向字符串"china"  
   cout.width(10); //指定域宽为10  
   cout<<pt<<endl; //输出字符串  
   cout.width(10); //指定域宽为10  
   cout.fill('*'); //指定空白处以'*'填充  
   cout<<pt<<endl; //输出字符串  
   double pi=22.0/7.0; //计算pi值  
   cout.setf(ios::scientific);//指定用科学记数法输出  
   cout<<"pi="; //输出"pi="  
   cout.width(14); //指定域宽为14  
   cout<<pi<<endl; //输出"pi值  
   cout.unsetf(ios::scientific); //终止科学记数法状态  
   cout.setf(ios::fixed); //指定用定点形式输出  
   cout.width(12); //指定域宽为12  
   cout.setf(ios::showpos); //在输出正数时显示"+"号  
   cout.setf(ios::internal); //数符出现在左侧  
   cout.precision(6); //保留6位小数  
   cout<<pi<<endl; //输出pi,注意数符"+"的位置  
   return 0;   
}  
运行结果如下:   
inputa:34 (输入a的值)   
dec:34 (十进制形式)   
hex:22 (十六进制形)   
oct:42 (八进制形式)   
China (域宽为10)   
***** China (域宽为10,空白处以'*'填充)   
pi=3.14285714e+00 (指数形式输出,8位小数)   
pi=3.1429e+00) (指数形式输小,4位小数)   
pi=3.143 (小数形式输出,精度仍为4)   
pi=3.1429(fixed确定小数点后精度为4 )

  dec:21 (十进制形式)
    hex:Oxl5 (十六进制形式,以0x开头)
    oct:025 (八进制形式,以O开头)
    China (域宽为10)
    *****china (域宽为10,空白处以'*'填充)
    pi=**3.142857e+00 (指数形式输出,域宽14,默认6位小数)
    ****3.142857 (小数形式输㈩,精度为6,最左侧输出数符"+")

2. 请阐述重载、重写、覆盖/隐藏的区别是什么?

(1)函数重载(Overloading):

定义: 函数重载是指在同一个作用域内,定义多个具有相同名称但参数列表不同的函数。

条件: 函数名相同,但参数的类型、个数或顺序不同。

作用: 提供了更灵活的函数调用方式,根据参数的不同选择调用不同版本的函数。

cpp 复制代码
int add(int a, int b);
double add(double a, double b);

(2)函数重写(Overriding):

定义: 函数重写是指在派生类中重新定义基类中已经存在的虚函数。

条件: 基类中的函数必须是虚函数,派生类中的函数要有相同的函数签名(函数名、参数类型和返回类型必须保持一致)。

作用: 允许派生类提供特定于派生类的实现,实现多态。

cpp 复制代码
class Base {
public:
    virtual void display() const;
};

class Derived : public Base {
public:
    void display() const override;
};

3)成员隐藏/覆盖(Member Hiding/Overriding):

定义: 当派生类中的函数屏蔽了基类中的同名函数时,称为成员隐藏或覆盖。

条件: 派生类中的函数与基类中的函数同名,但参数列表可以不同。(说人话就是,只要子类的函数与父类的函数有同名的,即使只要函数名相同,调用这个函数就是调用子类的)

作用: 防止基类的同名函数被派生类继承,如果没有使用 using 关键字,基类的同名函数在派生类中会被隐藏。

cpp 复制代码
class Base {
public:
    void display() const;
};

class Derived : public Base {
public:
    void display(int x) const;  // 隐藏了基类中的 display 函数
};
相关推荐
passer__jw7671 小时前
【LeetCode】【算法】3. 无重复字符的最长子串
算法·leetcode
passer__jw7671 小时前
【LeetCode】【算法】21. 合并两个有序链表
算法·leetcode·链表
sweetheart7-71 小时前
LeetCode22. 括号生成(2024冬季每日一题 2)
算法·深度优先·力扣·dfs·左右括号匹配
矛取矛求2 小时前
Linux如何更优质调节系统性能
linux
lb36363636363 小时前
介绍一下数组(c基础)(详细版)
c语言
李元豪3 小时前
【智鹿空间】c++实现了一个简单的链表数据结构 MyList,其中包含基本的 Get 和 Modify 操作,
数据结构·c++·链表
UestcXiye3 小时前
《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项
c++·计算机网络·ip·tcp
内核程序员kevin3 小时前
在Linux环境下使用Docker打包和发布.NET程序并配合MySQL部署
linux·mysql·docker·.net
kayotin4 小时前
Wordpress博客配置2024
linux·mysql·docker
一丝晨光4 小时前
编译器、IDE对C/C++新标准的支持
c语言·开发语言·c++·ide·msvc·visual studio·gcc