引用
引用就是一个变量的别名,通过引用所作的读写操作实际上是作用于原变量上
声明一个引用:
int x;
int& rx=x;
声明引用(reference)时候必须赋初值,指定其代表某个变量,且之后不能再改变改引用的指向.对引用调用=运算符同时改变引用和其指向变量的值,不改变引用的指向
int x = 0;
int *p = &x;
int& r = x; // r代表x,现在r,x都是0
int x2 = 5;
r = x2; // r不能重新代表其他变量,现在r,x都是5
int& r2 = r; // 现在r2,r,x都是5(r2和r都代表x)
引用的假象
- 引用对象和被指向的对象的大小相同(
sizeof(r)==sizeof(x)
) - 引用对象和被指向的对象地址相同(
&x==&r
)
在编写程序时,很少将变量类型声明为引用,引用一般用于声明参数类型(parameter type)和返回值类型(return type).
// 参数类型声明为引用,不影响函数体内使用变量的方式
void func1(Cls obj) { opj.xxx(); } // 值传递参数
void func2(Cls *Pobj) { pobj->XXX(); } // 指针传递参数,函数体内使用变量的方式需要修改
void func3(Cls &obj) { obj.xxx(); } // 引用传递参数,函数体内使用变量的方式与值传递相同
// 参数类型声明为引用,不影响参数传递的方式
Cls obj;
func1(obj); // 值传递参数
func2(&obj); // 指针传递参数,传递参数时需要对参数作出修改
func3(obj); // 引用传递参数,传递参数时不需对参数做出修改
值得注意的是,因为引用传递参数和值传递参数的用法相同,所以两个函数的函数签名(signature)相同,不能同时存在.
有意思的是,指示常量成员函数的const也是函数签名的一部分,因此const和non-const的同名成员函数可以在同一类内共存.
空指针与动态内存管理
空指针:nullptr
动态内存申请
- new <类型名>(初值);
- new <类型名>[常量表达式];
动态内存使用完毕后,要用delete运算符来释放
- delete<指针名>;
- delete []<指针名>;