1. C++提供了几种字符类型
char<字符>可以存放机器基本字符集中的任意字符对应的数字值
wchar_t<宽字符>可以存放机器最大扩展字符集中的任意一字符
char16_t和char32_t是Unicode字符,用于表示所有自然语言中字符的标准
2. 字符型分为char, signed char, unsigned char.
char和signed char并不一样,char由编译器决定表现为有符号还是无符号。因此不要用char做算术运算,要明确指定signed char或者unsigned char
3. 当表达式里既有带符号类型又有无符号类型时,带符号类型会自动转换成无符号类型
4. 以0开头的整数代表八进制数,以0x开头的整数代表16进制数
例如表示20: 20, 024, 0x14
5. \x后跟一个或多个十六进制数,或者\后跟1个,2个或3个八进制数字,其中数字部分表示的是字符对应的数值
如字符M对应77, char c=77, \x4d, \115均为字符M
6.const对象必须初始化
const对象被设定为仅在文件内有效(编译器进行替换,因此文件内必须有定义),如果想在多个文件之间共享const对象,必须在变量的定义之前添加extern关键字
引用必须在定义时用一个对象进行初始化,初始化之后两者就绑定在了一起,以后也不能修改这样的绑定关系。
7. 初始化常量引用时,允许用任意表达式作为初始值,只要表达式的结果能转换成引用的类型即可。
8. 指向常量的指针可以指向一个非常量对象,然后想要存放常量对象的地址,只能使用指向常量的指针。
9. 常量指针必须初始化
const int *p; //指向常整型的指针P,底层const
const int* const p; //指向常整型的常指针P,必须初始化
int* const p; // 指向整型的常指针P,必须初始化
10. 用于声明引用的const是底层const
指针类型的const可以是顶层也可以是底层
其他类型的const都是顶层const
11. 认定一个变量是一个常量表达式的话,就把它声明为constexpr类型
12. 当typedef遇上const
typedef char *pstring; //pstring是指向char的指针
const pstring cstr = 0; // cstr是指向char的常量指针
const pstring *ps; // ps是指向char常量指针的指针
13. auto类型必须有初始值,且一条语句声明的多个变量的初始类型必须一样。
14. decltype返回操作数的数据类型
decltype((var))的结果永远是引用,而decltype(var)只有当 var是引用时结果才是引用。
15. 当表达式的结果对象能作为一条赋值语句的左值时,decltype返回一个引用类型。
16. const用编译器保证对象的bitwise的常量性,mutable可以释放掉non-static成员变量的bitwise constness约束。
17. const修饰类成员变量时,如果是static常量,类内声明,类外初始化;如果是非static常量,在构造函数的初始化 列表中进行初始化。
class A {
public:
A():name("aaa"){}
private:
const string name;
};
class B {
public:
B(){}
private:
const static string name;
};
const string B::name("bbb");
一个特例是,如果static常量的类型是内置的整数类型,如char、int、size_t等,那么可以在类中直接给出初始值,且不需要在类外再进行定义了。编译器会将这种static常量直接替换为相应的初始值,相当于宏替换。但如果在代码中我们像正常变量那样使用这个static常量,如取它的地址,而不是像宏一样只使用它的值,那么我们还是需要在类外给它提供一个定义,但不需要初始值了(因为在声明处已经有了)。