1.算术类型
- 宽字符和
unicode
wchar_t 宽字符 16位
char16_t unicode 16位
char32_t unicode 32位
-
字符型
char/signed char/unsigned char char 和signed char并不相同,但三者只表现为有无符号两种情况
-
赋值超出范围问题
- 当给无符号整数类型赋值时,若超出表示范围,结果为初始值对无符号类型的表示数值总数取模
- 若给有符号类型超出范围,则是未定义,可能引发程序崩溃
-
不要将无符号和有符号数混用
-
当一个算术表达式中既含有无符号数,有含有
int
类型时,int
将会转换为无符号数,这样会引发一些问题。unsigned u=10; int i=-42; cout<<u+i<<endl //结果将是一个很大的数,因为i被转换为无符号数了 ... for(unsigned index=5;index>=0;--index) { //do something } ... //这将会是一个死循环,index永远都大于0
-
2.字面值
- 整数的字面值的类型为
int long long long
中能容纳该值的最小类型 -
short
类型无对应的字面值 - 字面常量不存在负数,符号只是代表取负值,而不在字面值之内
3.初始化、声明、定义
-
初始化方式
int a={0}; int b{0}; //上述为列表初始化 int c(0);
-
声明、定义
extern int i; //只声明 int j; //声明并定义 extern double pi=3.14; //定义
-
引用
- 引用不是对象,不能被引用
- 绑定后不能再绑定其他对象
-
指针
//指向指针的引用 int *p; int *&r=p; //从右向左解释,r是一个引用,引用的对象是一个int类型的指针
4.const 限定符
-
一些注意点
- 必须初始化
- 默认状态下,
const
对象仅在文件内有效,在不同文件中使用时,需要分别定义 - 当要多文件共享
const
对象时,不管声明还是定义,都加上extern
-
常量引用
const int ci=1024; const int &r1=ci; //正确 int &r2=ci; //错误,r2不是常量引用,会通过r2修改ci的值
-
初始化常量引用时允许用任意表达式作为初始值
int i=42; const int &r1=i; //正确 const int &r2=42; //正确 const int &r3=r1*2; //正确 int &r4=r1*2; //错误 ... double dval=3.14; const int &ri=dval; //等价于下方 const int temp=3; const int &ri=temp; //绑定的是一个临时变量
-
对
const
的引用可能引用一个并非const
的对象int i=42; int &r1=i; const int &r2=i; //虽然不能通过r2来修改i的值,但是可以通过r1修改
-
指针与
const
-
存放常量对象地址,只能用常量指针
-
允许一个指向常量的指针指向一个非常量对象(仅要求不能通过该指针来修改对象的值,而可以通过其他方式修改)
const int *p 与 int *const p 的区别 //从右向左解释 int *const p; // 变量 p 是一个常量,其类型由剩余部分决定,其是一个指针,指向int类型,故其为一个指向int类型的常量指针 const int *p; //变量 p 是一个指针,指向int 类型常量
-
-
top-level const & low-level cosnt
- 顶层const:指针本身是一个常量
- 底层const:指向的对象是一个常量
- 当执行对象拷贝时,拷入和拷出的对象必须具有相同的底层const资格
5.别名、auto、decltype
-
别名
typedef A double using A=double;
-
指针、常量、别名
typedef char *pstring const pstring cstr=0; //是一个指向char的常量指针 const pstring *ps; //ps为指针,指向的对象是指向char的常量指针
-
auto
-
会忽略顶层const,保留底层const
int i=0; const int ci=i,&cr=ci; auto b=ci; //b为int 类型 auto c=cr; //cr是ci的别名,ci是顶层const,所以忽略,c为int auto d=&ci //d指向整数常量的指针,保留底层const
-
-
decltype
-
如果decltype使用的表达式是一个 【变量】时,则decltype返回改变量的类型
-
若是一个表达式,则返回结果类型
int i=42,*p=&i,&r=i; decltype(r+0) b; //int decltype(*p) c; //*p的解引用是【int&】,引用需要初始化,所以错误
-
decltype的表达式若是加上了
( )
的变量,结果将是引用
-
6.头文件保护符
#ifndef
#define
...
#endif
//防止头文件多次包含
网友评论