一、命名空间
C++与C的区别中,很关键的一个就是C++多了一个作用域。C的作用域有三种,文件编译单元(main)、函数和复合语句。*(其中复合语句就是多个语句用{}括起来的一个语句,其中申请的局部变量只能在其使用)*而C++中多了一个类作用域。
老师所说,这个类作用域的优势是在大型项目会有优势,大型项目中需要很多人合作完成,那就难免会出现变量和函数的重复命名,而命名空间使得这些函数在调用的时候能够区分开来。
命名空间本质就是个独立于主函数,可以随时调用的作用域,和函数不同的时在使用的时候需要前置标明是哪个命名空间的。一直使用的格式也很简单:using namespace + 空间名
。其中空间名可以不加,也就构成了所谓的匿名空间。个人理解C++的匿名空间和C语言中的static修饰类似,匿名空间中的标识作用域只会在自身文件中,文件外部无法使用这些标识符。同一个层次的多个匿名空间会合并为一个。而匿名空间的补完写法如下:
namespace __compiler_generated_name__
{
}
using namespace namespace __compiler_generated_name__;
匿名空间中的全局标识符是和文件中的全局变量相冲突的:
namespace
{
int a = 2018;
}
int a = 1;
int main()
{
return 0;
}
这样就会报错。
命名空间成员的调用格式如下:空间名::函数名/标识符……
标准数据库中的命名空间是std。其中包含了常用的输入输出格式如 cout <<, cin>> 之类的。诺诗不适用using namespace std;的命令,也可用通过std::cout的方式调用。
二、标准输入输出
C++为了实现数据的输入输出定义了庞大的类库主要有ios、istream、ostream、istream、iostream等,其中ios是根基类。
实际使用中用的表较多是cin(标准输入流)和cout(标准输出流)。cerr和clog是用于输出错误的,区别也只是是否把错误存入缓冲区。
cin和cout实现输入输出是使用了类的标志符重载,将位操作用的"<<“和”>>"和重载为输入输出指令,且因为函数重载的原因,系统能够自动根据字符右边变量类型调用函数,所以不需要声明数据类型,这里就不重点介绍了。这就是和C语言中printf的本质不同,C++面向对象,会根据输入对象自动判别,而C面向过程,printf输出的时候需要声明变量类型。需要注意的是C++中单’\n’是没有刷新缓存区的作用的,所以换行都是推荐使用endl(能刷新缓存区)指令。
输入输出格式的控制分三种输入输出流枚举常量、内部函数、格式控制操作符,前两者经常一起使用。枚举常量使用的时候需要加ios::
,内部函数的使用格式cout.函数名
,格式控制操作符在cout<<语句中使用即可。
2.1常用的枚举常量:
dec(十进制)、oct(八进制)、hex(十六进制)、left(左对齐)、right(右对齐)、showbase(输出数值前加基数指示符)、showpoint(补全浮点数中的小数点和尾数后面的0)、scientific(设置后使浮点数按照科学表示法输出)和fixed(和scientific相对,浮点数按定点表示法输出)。
2.2常用的输入输出流内部函数:
char fill(char c);
设置填充字符,默认的为空格。
1、如果有参数c,返回值为之前用的填充字符,设置c为当前填充字符。
2、如果没有参数c,也就是fill(),则返回当前填充字符。
int precision(int n );
用于设置浮点精度,系统默认设置为6。
1、有参数则设置精度,返回之前的输出精度。
2、无参数的时候返回当前输出精度。
int setf(long f);
和 int unsetf(long f);
其中的 f 就是枚举型常量,前者根据枚举型常量的不同改变输出设置,后者则用来取消当前设置,否则下面的设置是无效的。
int width(int w);
用了设置输出所占字节数。
1、如果有参数w,则时正常设置所占字节数,并返回之前设置的参数值。
2、如果没有参数,则返回当前设置的参数值。
cin.getline()
和get()
是用于输入的函数,前者偏向获取字符串,后者偏向获取单字符。
cin.get(); //获取一个字符串为返回值
cin.get(char ch); //获取一个字符串到ch,成功返回非0值,失败返回0
cin.get(char* str, int size); //获取size-1个字符,遇到结束符则结束读取。
cin.getline(char * str, int size); //与上面那个类似
cin,getchar()和cin.getline()读取字符串的区别在于,cin.getline读取字节后会停在结束符后一位。而getchar(),则会停在结束符上。
cin.getline()和getline()的区别在于,使用getline()需要带头文件,而cin.getline()属于输入流函数。
2.3常用格式控制操作符:
dec、oct、hex、endl、ends、flush、setfill(int c),setw(int n)、setprecion(int n)。
其中表示进制的与枚举型常量功能相同,注意转换进制的时候,如果变量时字符型则要通关static_cast
转换数据类型。
1)endl,刷新流。
2)ends,输出一个字符'\0'
。
3)flush,刷新一个输出流。
4)setfill(int c),设置填充为字符c。
5)setw(int w),设置下一个输出宽域为w。
具体使用如下:
代码:
12 char buf[32];
13
14 cin.getline(buf, 32);
15 cout << setw(15) << buf << endl;
16 cout << setw(15) << left << setfill('*')<< buf<
输入helloworld后:
[root@jsetc 12.18]# ./2
helloworld
helloworld
helloworld*****
*****helloworld
377
ff
1.231231e+02
123.12312
对于浮点数操作:
7 float f = 100/ 6.; //c++中'/'代表了整数除法,float f = 100/6 的输出结果是16
8 cout<< f <
结果为:
[root@jsetc 12.18]# ./4
16.6667
16.67