zoukankan      html  css  js  c++  java
  • 【C++ Primer Chapter 2 总结】引用 & 指针 & const & constexpr

    1.引用变量需要初始化,绑定(bind)到某个对象,并且一旦初始化之后无法再重新绑定到其他变量。引用变量只是已经存在的对象的一个别名,不是对象。
    2.指针变量用于其他对象的间接访问(保存的是其他对象的地址)。指针对象本身是一个对象,可以被赋值/复制,可以指向不同的对象,不一定需要初始化。
    3.空指针不指向任何对象。三种方法初始化。nullptr是一种特殊的类型可以转换为其他指针类型。NULL是cstdlib头文件中的变量,值为零。在编译代码前,预处理器变量会被预处理器替换为其特定的值。
    int *p = nullptr;       //一般用这种方式初始化空指针
    int *p = 0;
    int *p = NULL;        //NULL会在编译前被替换为值0
     
    4.每个变量定义是由基础类型(base type)+一组声明符(类型修饰符 type modifier)组成的。当有多个类型修饰符时 ,以逻辑的形式组合。理解复杂指针/引用变量声明的方法:从右向左读定义.
    int a, *p = &a, &r = a;       //a是int, p是指向int的指针, r是int的引用. 这里int是基础类型, p前面的*和r前面的&都是类型修饰符   
    int* p;
    int *p;                 //和上面一样,两种写法
    int* p1, p2;             //p1是指向int的指针, p2是int. *是p1的类型修饰符,与其他变量无关
    int *p1, *p2;            //p1, p2都是指向int的指针
     
    int val = 42;             //val是int
    int *pi = &val;            //pi是指向int的指针
    int **ppi = π              //ppi是指向指向int的指针的指针
     
    int i = 42;
    int *p;
    int *&r = p;              //r是指针p的引用. 引用不是一个对象, 因此没有指向引用的指针. 指针是一个对象, 因此有指针的引用.  这里理解r的类型的方法:从右向左读定义. r最左边是&, 因此r是i一个引用, 剩下部分表示r引用的类型是指向int的指针.
    r = &i;
    *r = 0;
    cout << i;               //i的值被改为0
     
    5.要在多个文件中共享const对象,必须声明为extern。
    6.引用和const。
    “const reference” as the abbr. of“reference to const” 
    没有常量引用(const reference)的说法,因为引用变量一旦初始化之后,bind to an object,就不可改变,bind to another object。
    引用“引用”(refer to)的是const类型还是非const类型影响的是/是否可以通过引用名对原对象进行操作,而不会影响是否可以更改引用本身的绑定(不可更改)。
    可以将“引用”常量的引用绑定到任何非const的对象,字面值,或一般的表达式,只要该表达式可以转换到引用的类型。
    dobule dval = 3.14;
    const int &ri = dval;
     
    7.指针和const。
    指向常量的指针(pointer to const)并不表明指针指向的对象是否是常量,只是说明是否可以通过该指针改变指向的对象。
    常量指针(const pointer)必须初始化,并且初始化后值不可更改。指针本身是常量并不说明是否能通过指针改变指针指向的对象,只是说明该指针的值(指针存的地址)不可以改变。
     
    top-level const:指针本身是常量。应用于对象本身。
    low-level const:指针指向常量对象。(该对象可以不是常量,指向常量对象只是不能通过指针改变该对象)
    上面两个的区别主要在于拷贝对象的时候:top-level const可以忽视,low-level const不可以忽视,必须有相同的low-level const或者non-const可以拷贝给const对象。
     
    int i = 0;
    int *const p1 = &i;
    const int ci = 42;
    const int *p2 = &ci;
    const int * const p3 = p2;
    const int &r = ci;
     
    i = ci;                  //ok
    p2 = p3;               //ok
    int *p = p3;           // error: p3有low-level const, p没有
    int &r = ci;           // error: 不能将一般的int&引用绑到常量对象上 
     
    8.constexpr 变量。
    通过声明对象为constexpr,可以让编译器来确认变量是否是常量表达式。
    constexpr修饰指针变量时,施加的是top-level const的影响。
    const int *p = nullptr;     //  p是一个指向const int的指针
    constexpr int *q = nullptr;  // q是一个指向int的常量指针
     
    9.类型别名(Type Aliases)。
    typedef type new_type_name;
    using new_type_name = type;
    

      

    10.typedef 和 const。
    出现在base类型中的const修饰的是给定类型。
    typedef char *pstring;
    const pstring cstr = 0;      // base type: pstring(pointer to char). cstr is a constant pointer to char. 这里把pstring看做和int一样的基础类型. 这里的const是top-level.
    const pstring *ps;          // ps is a pointer to constant pointer to char. 这里的const是low-level.
    

      

     
     
  • 相关阅读:
    命名空间“Microsoft”中不存在类型或命名空间名“Reporting”(是否缺少程序集引用?)
    VS2017按F1使用中文帮助
    SQL Server重建所有表索引
    SQL Server行列转换
    GitHub笔记---邮箱访问错误
    C学习笔记(8)--- 文件读写
    C学习笔记(7)--- typedef,输入输出
    C学习笔记(6)--- 共用体,位域深入
    C学习笔记(5)--- 指针第二部分,字符串,结构体。
    C学习笔记(4)--- 指针的应用(第一部分)
  • 原文地址:https://www.cnblogs.com/tristatl/p/14825831.html
Copyright © 2011-2022 走看看