C++基础(构成,标准输入输出)

内容
C++程序的基本构成
有关输入输出的库

类型
函数

进制转换
域宽,填充
输出格式
不常用的操纵运算子
其他
namespace
重载
函数重载
运算符重载


C++程序的基本构成

1.预处理器编译指令:
#include<…>
2.编译指令:
using namespace std;
3.主函数:
int main(){
……
}
4.其他函数


有关输入输出的库

C++基础(构成,标准输入输出)_第1张图片

in out stream
输入 输出 流
C++基础(构成,标准输入输出)_第2张图片

类型

istream:输入类型

cin:标准输入
系统也会根据变量的类型从输入流中提取相应长度的字节
遇“空格”、“TAB”、“回车”都结束
cin>>a>>b>>c>>d;//正确
在这里插入图片描述

ostream:输出类型

cout:标准输出输出时,不必通知计算机按何种类型输出,系统会自动判别输出数据的类型,使输出的数据按相应的类型输出。
cout << a,b,c; //错误,不能一次插入多项
cout << a+b+c; //正确,这是一个表达式,作为一项
cout << a << b << c << endl;//正确,这是一个表达式,作为一项
cerr:标准错误
clog:标准信息

wistream:宽字节输入类型

cin:宽字节标准输入

wostream:宽字节输出类型

wcout:宽字节标准输出
wcerr:宽字节标准错误
wclog:宽字节标准信息
[注1] 宽字节指像中文一样的字符
C++基础(构成,标准输入输出)_第3张图片

函数

C++基础(构成,标准输入输出)_第4张图片
[例1] cout.setf(ios::scientific);
cout.precision(8);
cout << 12.23 << endl;
C++标准库中的操控器(Manipulator)
1.将换行符写入输出流,并将与设备关联的缓冲区的内容刷到设备中,保证目前为止程序所暂存的所 有输出都真正写入输出流。
2.清空输出缓冲区。

endl

endl输出一个换行符,并立即刷新缓冲区。对于有输出缓冲的流(例如cout、clog),如果不手动进行缓冲区刷新操作,将在缓冲区满后自 动刷新输出。
[注2] endl与\n的区别:’\n’表示一个换行符,不刷新缓冲区。
不过对于cout来说(相对于文件输出流等),缓冲一般体现得并不明显。但是必要情况下使用endl代替’\n’一般是个好习惯。
对于无缓冲的流(例如标准错误输出流cerr),刷新是不必要的,可以直接使用’\n’。
[注3] 缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。使得低速的输入输出设备和高速的CPU能够协调工作,避免低速的输入输出设备占用CPU,解放出CPU,使其能够高效率工作。

flush

直接刷新缓冲区的

ends

则在输入后加上一个空字符,然后再刷新缓冲区

cout << unitbuf

不执行任何动作,而是设置这个cout输出流 在接下来的每次操作之后都进行刷新缓冲区

cout << nounitbuf

这里nounitbuf则是让cout 回到正常的缓冲方式

in out manipulator
输入输出 操纵器

进制转换

dec

置基数为10 相当于"%d"

hex

置基数为16 相当于"%X"

oct

置基数为8 相当于"%o"

setbase(int n)

将数字转换为 n 进制.
如例1;

域宽,填充

setfill( char c )

设填充字符为c

setw( n )

设域宽为n个字符,每次设置只生效一次
如例2;

输出格式

setprecision( long f)

设显示有效数字为n位

setiosflags (标志)

打开某个输出格式标志

resetiosflags(标志)

关闭某个输出格式标志

标志(iostream) 作用
ios::skipws 在输人中跳过空白
os::left 左对齐值,用填充字符填充右边
ios::right 右对齐值;用填充字符填充左边(缺省对齐方式)
ios::internal 在指定任何引导标记或基之后增加填充字符
ios::dec 以基10(十进制)格式化数值(缺省进制)
ios::oct 以基8(八进制)格式化数值
ios::hex 以基16(十六进制)格式化数值
ios::showbase 以C++编译器能读的格式显示数值常量
ios::showpoint 对浮点数值显示小数点和尾部的0
ios::uppercase 对于十六进制数值显示大写字母A到F,对于科学格式显示大写字母E
ios::showpos 对于正数显示正号(+)
ios::scientific 以科学格式显示浮点数值
ios::fixed 以定点格式显示浮点数值
ios::unitbuf 导致在每次插入之后ostream::osfx刷新该流。缺省地,cerr是缓冲的单元
ios::stdio 导致在每次插入之后ostream::osfx刷新该流的stdout和stderr

多个标志可以用 | 运算符连接,表示同时设置。如例4;
[例2] cout << setbase(8) << setw(5) << 255 << endl;
" 377"
[例3] cout << setfill(’*’) << setw(5) << ‘a’ << ‘b’ << endl;
“****ab”
[例4] cout << setiosflags(ios::scientific|ios::showpos) << 12.34;
“+1.234000e+001”

不常用的操纵运算子

boolapha

把 true 和 false 输出为字符串 不常用

*noboolalpha

把 true 和 false 输出为 0、1

showbase

输出表示数值的进制的前缀

*noshowbase

不输出表示数值的进制.的前缀

showpoint

总是输出小数点

*noshowpoint

只有当小数部分存在时才显示小数点

showpos

在非负数值中显示 +

*noshowpos

在非负数值中不显示 +

*skipws

输入时跳过空白字符

noskipws

输入时不跳过空白字符

uppercase

十六进制数中使用 A~E。若输出前缀,则前缀输出 0X,科学计数法中输出 E

*nouppercase

十六进制数中使用 a~e。若输出前缀,则前缀输出 0x,科学计数法中输出 e。

internal

数值的符号(正负号)在指定宽度内左对齐,数值右对 齐,中间由填充字符填充


其他

namespace

命名空间:通过名称空间来区别不同的代码功能
[例5] xiaopangzi编了一个封装文件,damowang编了一个封装文件

C++基础(构成,标准输入输出)_第5张图片 C++基础(构成,标准输入输出)_第6张图片

xiaopangzi 和 damowang 都含有一个 sum 函数,此时可以通过 xiaopangzi::sum() 与 damowang::sum() 来分别调用这两个函数。
同样的,在std命名空间中的cin,cout等也可以用std::cin,std::cout来调用
若要略去前面的xxx::就可以使用using namespace std(使用std的命名空间),这之后就可以直接使用cin,cout了
更安全的用法,用什么函数就换一个
[例6] using damowang::sum 可直接使用damowang中的sum函数
using std::cout 可直接使用std中的cout

重载

函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
标准输入输出这里有运算符重载,所以讲一下概念。
cout中的插入运算符(<<)与按位左移运算符(<<)是一样的
同样的,C中&即表示地址运算符,也表示按位AND
*即表示乘法,也表示对指针解除引用
在C++中允许用户定义的类型重新定义运算符的含义。

函数重载

重载声明

C++中声明重载的函数跟声明其它函数没什么不同。只不过它跟其它的某个函数重名。重载函数必须使用不同的变量,否则编译器没法区分它们。
[例7] 如,可以定义如下的重载函数put:
int put(int c); // putchar
int put(int c, FILE *f); // fputc
int put(char const *s); // puts
int put(char const *s, FILE *f); // fputs

重载决策

当编译器遇到对函数put的调用,它会选择函数参数完全匹配的函数声明进行调用的过程被称为重载决策
[例8] put(‘a’, stdout); 调用int put(int c, FILE *f);

最佳匹配与歧义
有可能会有多个重载函数能够匹配一个函数调用。
[例9] 最佳匹配
void f(int i);
void f(long int li);
void f(char p);
void f(double d, int i);
此时调用f(0)。0可以被看做int,long int或char
类的空指针。
但是参数0被当作int类型,那么调用其他的比如void f(long int li)就需要将int 转换为long int , 此时void f(int i)就是最佳匹配
[例10] 歧义
如果void f(int i)没有被声明,那么重载决策就必须从void f(long int li);void f(char *p);中选一个,这两个都需要转换,没法找出最优匹配,调用不明确,造成编译错误

运算符重载

重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。
C++基础(构成,标准输入输出)_第7张图片

C++基础(构成,标准输入输出)_第8张图片


你可能感兴趣的:(编程学习)