《C++Primer e5》第二章。
1. 默认初始化,值初始化
值初始化:在类型名后跟一对空括号。
string *ps1 = new string; //默认初始化为空string
string *ps2 = new string(); //值初始化为空string
int *pi1 = new int; //默认初始化;*pi1的值未定义
int *pi2 = new int(); //值初始化为0;*pi2为0
对于内置类型来说:默认初始化的对象的值是为定义的;值初始化的对象有着良好定义的值。
对于定义了自己的构造函数的类类型来说,默认初始化和值初始化都会通过默认构造函数来初始化。
p408
2. 分离式编译机制,变量的声明与定义
为什么需要分离式编译机制?为了将程序拆分成多个逻辑部分来编写,每个部分放在不同的文件中,各个文件可以被独立编译。这样的话就需要在多个文件之间共享代码。于是C++语言将声明与定义分开。
头文件只能包含那些只能被定义一次的实体。
参考p41,p67,p186
3. C++是一种静态类型的语言,如何理解?
C++是一种静态类型的语言,其含义是在编译阶段检查类型。
参考p42
4. 一条声明语句由一个基本数据类型和紧随其后的一个声明符列表组成。
基本数据类型可以是单纯的一个类型,也可以是“typedef 类型”,“const 类型”。
声明符可以是简单的一个变量名,还可以是“*变量名”,“&变量名”,“*&变量名”,“**变量名”等复合类型。
因此 对于声明语句 char *p;最好将*和p写在一起,表示一个声明符;而不要写成 char* p;
p45
5. 默认情况下,const对象仅在文件内有效。如果想在多个文件之间共享const对象,则在变量的定义之前添加extern关键字。
p54
6. 顶层const,底层const
顶层const表示变量本身是const;底层const表示变量(主要是指针和引用)所指向的对象是const。
注意:用于声明引用的const都是底层const。因为引用本身不是对象。
p57
7. constexpr变量
因为const修饰的变量可能在编译时还不能确定该变量的值。比如 const size = get_size();
但由constexpr修饰的变量就可以由编译器来验证该变量的值是否是一个常量表达式。
constexpr修饰指针时只表示指针变量本身是常量,不代表所指向的对象是常量。
p59
8. 当类型别名遇到const或者复合类型后...,如何理解?
typedef char *pstring;
const pstring cstr = 0; //cstr本身是一个const对象,cstr又是一个指针,所以cstr是一个指向char的常量指针。注意:不能这样替换 const char *cstr = 0;
const pstring *ps; //ps是一个指针,ps本身不是const,ps所指向的对象是const,所以ps是一个指针,ps指向的对象是一个指向char的常量指针。
技巧:不要做对类型别名做替换,而是将类型别名看作普通的自定义类型去理解,比如Person类。
p61
9. 类型说明符auto
通过变量的初始值来推断变量的类型。
10. 类型说明符decltype
从变量或者表达式推断得到类型。