包括C++ primer 5th edition第2章的一些问题
1.不同的初始化方式
int num=0;
int num(0);
int num{0};//列表初始化
int num={0};//列表初始化
注意如果存在丢失数据的风险,列表初始化将不会成功
如:
double num1=3.1415926;
int num2;
num2={num1};//报错!!!
num2{num1};//报错!!!
2.关于const:
(1)使用const定义的变量必须初始化!
例如const int i;//错误!没有初始化!
(2)const定义的变量只在文件内有效,如果想共享可以在前面加extern:
extern const double pi=3.1415926
(3)初始化对常量的引用时允许赋予它任意值(只要能正确地类型转换),但是:
double pi=3.14159;
int& num=pi;// 错误,不是对常量的引用
(4)对常量的引用不允许通过修改引用来修改绑定的值。
(5)指向常量的指针和常量指针不一样。一个叫pointer to const另一个叫const pointer,后者是说指针本身是常量。
3.读定义的诀窍是从右往左读,这招对理解复杂的定义很有效:
int p;//p是整型
int* p;//p是指向整型的指针类型
int* const p;//p是一个常量且p是指向整型的指针,p的地址不可修改,指向的值可以修改
const int* p;//p是一个指向整型的指针,且指向的值不可修改,p是指向常量的指针
const int* const p;// p是一个常量,p是指向整型的指针,且指向的值不可修改,是常量指针
注意:对于int *const p,如果用常量的地址去初始化它会报错,因为常量的地址会被“解读”成一个指向常量的指针,而p并不是指向常量的指针,只是它的值(就是p自己的地址)是常量(即p是常量指针),所以编译器会说:[Error] invalid conversion from 'const int*' to 'int*'[-fpermissive]
4.C++11新引入的东西:constexpr
如果认定某个变量是常量,就把它申明为cosntexpr。所谓constexptr(常量表达式)是有初始值和类型两方面来确定的,它是在编译之前就明确知道是什么值的变量。
5.C++11新引入的:using a=b;可以起到typedef b a;的效果,a是b的类型别名。