c++ primer 笔记,第二章

  1. 初始化的含义是创建变量并赋予其一个初始值,赋值的含义是将对象当前的值擦除
  2. 初始化四种方式

    int n = 0;
    int n = {0};  //用花括号称为列表初始化,当使用列表初始化且初始值存在丢失的风险,编译器会报错
    int n{0};
    int n(0);
  3. 定义于函数体外的变量被初始化为0,函数体内部的内置类型变量不被初始化,类的对象的值由类决定

  4. 声明使得名字为程序所知,再变量名前加上关键字extern,变量声明规定了变量的类型和名字;定义负责创建与名字关联的实体,申请存储空间,也可能为变量赋一个初始值。任何包含了显式初始化的声明即称为定义。变量可以被声明多次,但只能定义一次;在函数体内部,试图初始化一个由extern关键字标识的变量将引发错误。

  5. 定义引用时,程序把引用和他的初始值绑定在一起,而不是将初始值拷贝给引用;一旦初始化完成,引用无法再重新绑定到另一个对象,因此引用必须初始化;引用并非对象,所以不能定义引用的引用;引用只能绑定在对象上,不能与字面值或某个表达式的计算结果绑定在一起。

  6. 指针本身就是一个对象,允许对指针赋值和拷贝;指针无需在定义时赋初值;因为引用不是对象,没有实际地址,所以不能定义指向引用的指针;不能用int型变量初始化一个指针为空指针,即使这个变量值恰好为0也不行,最好使用nullptr初始化一个空指针,避免使用NULL;void*型指针:以void*的视角来看,内存空间也仅仅就是内存空间,没办法啊访问内存空间中所存的对象

  7. 指针与引用区别
    (0)指针是一个对象,但引用不是,引用无实际地址,所以不能定义引用的引用,也不能定 义指向引用的指针;
    (1)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的);
    (2)指针在参数传递时其实是拷贝传递,相当于在将指针拷贝了一份传过去了,此时在调用函数中的指针和主函数中的指针两者指向了同一块内存区域,但是在调用函数中修改指针并不会影响主函数中指针的值;
    (3)可以有const指针,但是没有const引用;
    (4)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的);
    (5)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;
    (6)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了;
    (7)”sizeof引用”得到的是所指向的变量(对象)的大小,而”sizeof指针”得到的是指针本身的大小;
    (8)指针和引用的自增(++)运算意义不一样;
  8. const对象必须初始化;默认情况下,const对象被设定为仅在文件内有效;如果要在多个文件中共享const对象,必须在变量的定义之前添加extern关键字;常量引用仅对引用可参与的操作做出了限定。对于引用的对象本身是否常量未作限定;当执行对象拷贝操作时,顶层const无影响,拷入烤出的对象都必须有相同的底层const资格,非常亮可以转化为常量,反之则不行。

  9. 常量表达式的值不会改变且编译过程就可以得到计算结果constexpr类型是便于编译器来验证变量是否是一个常量表达式,可以用constexpr函数去初始化constexpr变量,如果你认为一个变量是个常量表达式,那就把它声明为constexpr类型,这样若并不是一个常量表达式,则编译器会报错;constexpr指针的初始值必须是nullptr或者0,或者是存储于某个固定地址的对象(定义于函数体之外的对象)constexpr修饰指针仅对指针有效,与指针所指的对象无关,constexpr把它修饰的对象置为顶层const;

    ocnst int *p = nullptr;       //p是一个指向整型常量的指针
    constexpr int *q = nullptr;   //q是一个常量指针
  10. auto一般会忽略到顶层const,如果希望推断出的auto类型是一个顶层const,需要明确指出;decltype与auto不太一样,会返回该变量的类型(包括顶层const和引用在内);引用从来都作为所引用对象的同义词产生,只有用在decltype处是一个例外;decltype(*p)的结果为int&而非int

    /*decltype的表达式加括号与不加括号会有不同,如果变量加上一层或多层括号,编译器就会把它当成一个表达式,变量是一种可以作为左值的特殊表达式,所以这样的declytpe就会得到引用类型*/
    decltype((i)) d;   //错误,d是int&,必须初始化
    decltype(i) e;     //正确,e是一个(未初始化)的int
    /*decltype((var))(双层括号)的结果永远是引用,而decltype(var)只有当var本身是一个引用时才是引用*/

猜你喜欢

转载自blog.csdn.net/chuxin126/article/details/78448157