- 类型增强
1 类型检查更严格
int num=325;
const int* a=# // 情况1
int const *a=# // 情况2
int* const a=# // 情况3
const int* const a=# // 情况4将数据类型去掉,可更直观地查看const修饰谁。
情形1:const * a
const修饰指针a所指向的变量,即指针a指向为常量,表示不能修改指针a所指向的内容;
但可通过修改num的值修改内容,或通过修改指针a所指向的变量修改内容;
该情形可以先不初始化,因为指针本身不是常量;
int num=325,n=1988;
const int* a=#
*a=1988; // 错误
num=1988; // 正确,通过修改num的值来修改a所指向的内容
a=&n; // 正确,通过修改a指向的变量来修改a所指向的内容情形2:const * a
同情形1;
情形3:* const a
const修饰指针a,即指针a本身是常量,表示指针a不能指向其他内存空间;
该情形必须在定义同时进行初始化;
int num=325,n=1988;
int* const a; // 错误,没有初始化
int* const a=# // 正确
*a=1988; // 正确,允许修改值
a=&n; // 错误情形4:const * const a
const修饰指针a和指针a指向的内容,表示指针a和指针a指向均为常量;
2 布尔类型bool
布尔类型数据的取值只有两个,即false和true;
可将bool类型转化成int类型,flase为0,true为1;int类型转化成bool类型,非0整数表示true,0表示false;
3 真正的枚举enum
enum WEEK{ Sun, Mon, Tue, Wen, Thur, Fri, Sat };
WEEK today = Mon; // 正确
WEEK today = 1; // 错误,只能用被枚举出来的元素初始化
WEEK today = WEEK(1); // 正确,可用强制类型转换初始化
注意:
C++中,尽量使用枚举或const修饰常量,尽量不使用宏#define;
4 表达式的值可被赋值
int a, b = 5;
(a = b) = 10; // 正确,等价于a=b;a=10;
(a<b ? a : b) = 200; // 正确,先取最小值为b,再将b赋值给200 C++某些表达式可以被赋值;
- 输入与输出cin/cout
一、输入输出流
1 标准输入流cin
cin是istream类一个实例,cin对象附属到标准输入设备,通常是键盘;
2 标准输出流cout
cout是ostream类一个实例,cout对象附属到标准输出设备,通常是屏幕;
3 标准错误流cerr
cerr是ostream类一个实例,cerr对象附属到标准输出设备,通常是屏幕;
但cerr对象是非缓冲的,且每个流插入到cerr,立即输出;
4 标准日志流clog
clog是ostream类一个实例,clog对象附属到标准输出设备,通常是屏幕;
但clog对象是缓冲的,每个流插入到clog,先存储在缓冲区,知道缓冲填满或缓冲区刷新才会输出;
注意:
对于小实例,无法区分cout、cerr和clog;
但在编写和执行大型程序时,三者之间差距很明显,使用cerr流显示错误信息;其他日志消息使用clog输出。
二、格式化