引用(reference)

  • 引用为对象起了另一个名字

    int ival = 1024;
    int &refVal = ival;  //refVal指向ival,是ival的另一个名字
    int& refVal2 = ival;
  • 引用必须被初始化,不存在空引用,无法令引用重新绑定到另外一个对象

    int &refVal; //报错,引用没有初始化
  • 定义了一个引用后,对其进行的所有操作都是在与之绑定的对象上进行的

    refVal = 2; //将2赋给了refVal指向的对象
    int &refVal3 = refVal; //将refVal3绑定到refVal绑定的对象上
  • 引用本身不是一个对象,所以不能定义引用的引用

  • 引用的类型要和与之绑定的对象严格匹配,引用类型的初始值必须是一个对象

    int &refVal4 = 10; //错误:引用类型的初始值必须是一个对象
    double a = 3.14int &refVal5 = a; //错误:类型不匹配

    两个例外

    //1.在初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型
    int i = 42;
    const int &r1 = i;
    const int &r2 = 42;  //正确:r2为一个常量引用
    const int &r3 = r1 * 2;  //正确:r3为一个常量引用
    //2.存在继承关系的类,可以将基类的指针或引用绑定到派生类对象上。

指针(pointer)

  • 指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象。

  • 指针无需在定义时赋值,在块作用域内定义的指针如果没有初始化,也将拥有一个不确定的值。

    int *ip1; //ip1是指向int型对象的指针
    int* ip2; //合法但容易产生误解
    int* a,b; //a为指向int的指针,b为int型变量
  • 指针存放某个对象的地址,要想获取该地址,需要使用取地址符(&)

    int ival = 42;
    int *p = &ival; //p存放变量ival的地址,或者说p是指向变量ival的指针
  • 除两种例外情况,其他所有指针的类型都要和它所指向的对象严格匹配

  • 如果指针指向一个对象,则允许使用解引用符(*)来访问该对象

    cout << *p;  //输出42
    *p = 0;  //为*p赋值实际上是为p所指的对象赋值
    cout << *p; //输出0
  • 空指针(null pointer)

    不指向任何对象

    int *p1 = nullptr; //等价于int *p1 = 0;
  • void*指针

    void *pv = &obj; //obj可以是任意类型的对象
  • 指向指针的指针

    int ival = 1024;
    int *pi = &ival;   //pi指向一个int型的数
    int **ppi = &pi;  //ppi指向一个int型的指针
  • 指向指针的引用

    int i = 42;
    int *p;
    int *&r = p; //r是一个对指针p的引用

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

jQuery 上一篇
外部排序 下一篇