概念
C++的引用本质就是对已经存在的对象的别名,引用提供了一种方便的方式来操作对象,而不需要复制对象本身。引用在编译器层面实现,通常用指针来实现引用。而且是指针常量,也就意味着该指针的指向是不能变的。
注意事项
1.初始化
引用在声明时必须进行初始化且初始化后不能发生改变
int a = 10;
int &b; //错误,没有进行初始化
int &b = a; //初始化
int c = 20;
b = c; // 此时并不是再为c起别名,而只是一种赋值操作,此时a,b,c都等于20,
//其中a和b是同一块内存空间
2.引用作为函数参数
引用常用于函数参数传递,可以通过引用在函数内部修改传递的参数的值,这种方式不需要通过指针传递或返回值来修改值的修改,同时可以避免对象的复制
int swap(int &a,int &b){
a = a^b;
b = a^b;
a = a^b;
//或者也可以:
//a = a+b;
//b = a-b;
//a = a-b;
}
int a = 10;
int b = 20;
swap(a,b);
3.引用作为返回值
引用也可以作为函数的返回值,允许函数返回一个引用类型的对象,但需要注意返回引用时,应确保被引用对象生命周期足够长,避免返回一个已经销毁的对象引用
例如下面这段代码用static关键字定义了一个静态变量,存在全局区就不会在函数执行完后就销毁
int& test(){
static int a = 10;
return a;
}
int main(){
cout << test() << endl; //10
int& ref = test();
cout << ref << endl; //10
//此时函数调用也可以作为左值(如果函数的返回值是引用)
test() = 1000;
cout << ref << endl; // 1000
cout << test() << endl; // 1000
system("pause");
}
4.常量引用
常量引用一般是用来修饰形参,防止误操作
形式就是在函数列表中,可以加const修饰形参,防止形参更改实参。
int& ref = 10;//错误操作,引用必须是一块合法的空间,此时10并没有空间
const int& ref = 10;//合法,等价于int tmp = 10,const int& ref = tmp;
//不过此时已经拿不到原名了,只能操作别名ref,并且不能更改,为只读
ref = 20; //表达式必须是可修改的左值
//不过常用的场景为下述
void showValue(const int& val){ //防止误操作修改,不用值传递是因为避免使用额外空间
cout << val << endl;
}
val = 10;
showValue(val);