2.2.1|变量定义:关于{}花括号的列表初始化|当用于内置类型的变量时,这种初始化形式有一个重要特点:如果使用列表初始化且初始值存在丢失信息的风险,则编译器将报错。
2.2.2|变量声明extern:只能定义一次,可以多次声明,(在函数体内)声明不应包含初始化,否则将引发错误。
2.2.4|用::显式访问全局变量
2.3.1|引用本身不是一个对象,不能定义引用的引用,(46页例子的解释:)
引用的类型必须与被其所引用对象的类型一致。
2.3.2|建议初始化所有指针,在可能的情况下,尽量等定义了对象之后再定义指向它的指针。如果实在不清楚,就初始化为nullptr或者0。
2.3.3|面对一个比较复杂的指针或引用的声明语句时,从右向左阅读有助于弄清楚他的真实含义:int *&r = p;(r是一个引用,*说明r引用的是一个指针,int指出r引用的是一个int指针)
2.4 |如果想在多个文件之间共享const对象,必须在变量的定义之前添加extern关键字。(对于const变量不管是声明还是定义都添加extern关键字)全局变量
2.4.1|两个例外:
||第一种是在初始化常量引用时允许用任意表达式作为初始值,只要结果能转换成引用的类型即可。尤其,允许为一个常量引用绑定非常量的对象、字面值、一般表达式
||第二种是什么?在书上没有看到
2.4.2|指针的类型必须与其所指对象的类型一致,但是有两个例外:
||第一种例外情况是允许一个指向常量的指针指向一个非常量对象(不能通过该常量指针改变非常量对象的值)
||第二种是什么?在书上没有看到
2.4.3||顶层const:
||顶层const表示指针本身是个常量,底层const表示指针所指的对象是一个常量。(用于声明引用的const都是底层const)
||当执行对象的拷贝操作时,常量是顶层const还是底层const区别明显。其中,|||顶层const不受影响。
|||底层const的限制:当执行拷贝操作时,两个对象必须具有相同的底层const资格
2.4.4||常量表达式constexpr:值不会改变并且在编译过程就能得到计算结果的表达式。 函数体内定义的变量一般来说并非存放在固定地址中,因此constexpr指针不能指向这样的变量,相反的,定义于所有函数体之外的对象其地址不变,能用来初始化constexpr指针。
constexpr是顶层const:const int *p = nullptr;//p是一个指向整型常量的指针 constexpr int *q = nullptr;//q是一个指向整数的常量指针
2.5.2|auto编译器推断出来的auto有时和初始值的类型并不完全一样:
||首先,引用对象的类型作为auto的类型:int i = 0, &r = i; auto a = r;//r是一个整数
||其次,auto一般会忽略掉顶层const,同时底层const则会保留下来(如果希望推断出的auto类型是一个顶层const,需明确指出)
2.5.3|decltype有时希望从表达式的类型推断出要定义的变量的类型,但是不想用该表达式的值初始化变量。(选择并返回操作数的数据类型)
||decltype处理顶层const和引用的方式与auto有些许不同。如果decltype使用的表达式是一个变量,则返回该变量的类型(包括顶层const和引用在内);
需要指出的是,引用从来都是作为其所指对象的同义词出现,只有用在decltype处是一个例外。
||向decltype返回一个引用类型,意味着该表达式的结果对象能作为一条赋值语句的左值:
int i = 42, *p = &i, &r = i;
decltype(r + 0) b; //correct
decltype(*p) c; //wrong 如果表达式的内容是解引用操作,则decltype将得到引用类型。引用必须初始化
decltype( (i) ) d; //wrong
切记:decltype( (variable) )两层括号的结果永远是引用,而decltype(variable)结果只有当variable本身是一个引用时才是引用
int a=3,b=4;
decltype( a=b ) c =a ; //c是引用类型,
//c=3,decltype不会执行其中的表达式或函数,只是返回其类型。
赋值是会产生引用的一类典型表达式。
2.6.3|#ifndef #define #endif