c++11分章1

主要内容: 引用,指针,数组,动态内存分配

引用

  • <类型>&<变量> = <对象或变量>

  • 定义

    引用就是变量的另一个别名,对应的变量/对象必须存在

    1
    2
    3
    int x;
    int& rx = x;
    // int x,&rx = x;
  • 性质

    ​ 1.通过引用所做的读写操作实际上是作用于原变量上的

    ​ 2.引用必须在声明时,开始初始化

    ​ 3.引用一旦初始化,引用的名字不能再指定给其他变量

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int a { 0 }, b { 1 };
    int& r { a }; // 引用变量 r 在声明的同时就要初始化,r是a的别名

    r = 42; // 相当于 a = 42
    r = b; // 相当于 a = b; 执行后 a 的值是1
    // 此处不是让r变成b的引用
    // 引用r声明并初始化后,r就不能再改为其它变量的引用
    int& r2 = a; // 继续给a起别名
    int& r3 = r; // 声明引用变量 r3,用r初始化
    // 这个相当于 int& r3 = a; 因为 r 是 a 的别名
  • 指针和引用的差异

    指针和引用的应用场景是函数参数传递

    void f(int* pa ,int* pb); void f(int& pa,int& pb);

    从软件设计角度来看,使用引用更好,因为调用方不需要额外传参数时进行取地址运算.

    • 存取值的方式
      • 对指针变量需要使用*来读取相应内存的内容
    • 初始化
      • 指针没有要求
    • 对象或变量的存在性
      • 引用有要求
  • const和引用

    **const <类型>&**常用于返回值以及参数传递(保证不能修改相应的变量)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //变量的引用
    int val =100;
    int & myval1=var;
    const int & myval2 = var;
    myval1 = 300;//合法,可以通过myval2对var进行修改,此时myval2,myval3,var同时被修改
    myval2 = 100;//非法

    //常量的引用
    int b=100;
    const int& aa=b;//b的引用,可以选择用const的修饰
    const int& bb=1;//这里必须用const修饰
    aa = 10//非法
    bb = 20;//非法
  • 引用在参数传递中的使用

    如果在函数中不修改变量,建议使用 const T&

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int var =100;  
    const int cvar =200;
    /*形参:
    void f(int a1,int &a2, const int& a3)
    { }*/
    f(1,2,3);//2和a2 不合法
    f(1,var,var);

    f(1,cvar,cvar);//cvar与a2 不合法
    f(1,var,cvar);

    f(1,cvar,var);//cvar和a2 不合法
    f(var,var,var);
    f(cvar,var,cvar);

二维数组的初始化方式

空指针和动态内存分配

1.1 0带来的二义性问题

  • C语言中,空指针使用(void *)0来表示, 有时候,用“NULL”来表示空指针(由编译器决定实现方式,一种可能的实现方式是#define NULL 0)
  • C++03中,空指针使用“0”来表示。0既是一个常量整数,也是一个常量空指针。
  • C++11中引入保留字“nullptr”作为空指针