0%

2024-03-21-c++引用和指针

  • 引用是变量的一个地址别名,必须要初始化,不可以修改指向地址
  • 指针就是一个地址,可以修改指向

左值引用和右值引用

  • 左值引用,左值是非临时的,并且左值是可修改,可取地址
  • 右值引用,右值是临时的

    左值引用、右值引用

    根据名字大概就可以猜到意思,左值引用就是对左值进行引用的类型,右值引用就是对右值进行引用的类型,他们都是引用,都是对象的一个别名,并不拥有所绑定对象的堆存,所以都必须立即初始化。
1
2
type &name = exp; // 左值引用
type &&name = exp; // 右值引用

左值引用
看代码:

1
2
3
4
5
int a = 5;
int &b = a; // b是左值引用
b = 4;
int &c = 10; // error,10无法取地址,无法进行引用
const int &d = 10; // ok,因为是常引用,引用常量数字,这个常量数字会存储在内存中,可以取地址

可以得出结论:对于左值引用,等号右边的值必须可以取地址,如果不能取地址,则会编译失败,或者可以使用const引用形式,但这样就只能通过引用来读取输出,不能修改数组,因为是常量引用。
右值引用
如果使用右值引用,那表达式等号右边的值需要时右值,可以使用std::move函数强制把左值转换为右值。

1
2
3
int a = 4;
int &&b = a; // error, a是左值
int &&c = std::move(a); // ok

类(内存模型)

  • 析构函数需要加virtual,这样才能调用基类和子类的析构
  • 向上转型中的重载方法,基类中的方法加virtual,这样调用方法时才能调用到子类的方法,否则只能调用到基类的方法
  • 构造函数顺序:基类,派生类,如果基类有多个,按照派生类表中的基类顺序调用;析构函数则相反

友元函数和类

explicit 构造函数 - 避免隐式转换