引用 reference
求地址运算符 &
在C++
里面,如果想要得到找到一个变量的地址,就可以使用&variable
来实现,比如:
1 | int main() |
运行结果就是:0x61fe9c
,返回的这个地址类型是int*
,也就是指针类型,可以被指针变量保存。
引用 reference
基本用法
C++
里面有引用功能,说白了就是别名,其本质上就是给一个变量再起一个名字,使用方法就是&new_variable=declared_variable
。这样new_variable
和declared_variable
就是同一个变量,占用一个内存空间,使用任意一个名字更改值,另一个调用值也会变。
1 | int a=10,&b=a,&c=b; |
注意
&不是求地址运算符,而是起标志作用
引用的类型必须和其所绑定的变量的类型相同
上面声明的三个变量是同一个变量,使用同一个内存空间,无论用哪一个变量名赋值,输出三个的值都是一样的。
- 引用主要用于在函数传入参数的时候,可以把实参传过去。这样就不用生成一个形参,也可以顺便更改实参的值。节省代码量和空间开销。
1 | void Xorex(int &a,int &b,int &c) |
这样被传入的a,b,c
的值都会改变,最终结果就是10 20 30
数组引用
在对数组进行引用的时候,格式有些不同,需要使用(&new_variable)[Num]=declared_variable
,而且new_variable
数组的空间大小必须要和declared_variable
数组的空间大小相同。
1 | int main() |
你就会发现输出的两个数组的地址一模一样,引用成功。
引用还可以对指针类型的引用,语法:类型 *&引用名=指针名;
也可以理解成指针的类型为:类型*,比如int*
。
一定要注意变量的类型要统一啊!!!
1 | int main() |
结果输出的三个地址是一样的。
常引用
常引用不允许通过该引用对其所绑定的变量或对象进行修改,也就是说只能通过原变量名改变这个地址所存储的值,而不能通过引用的变量进行更改:
1 | int main() |
上面的代码编译就会报错 error: assignment of read-only reference b
,同时常声明 const
对于任何类型声明都有效,可以保证所声明的变量无法被更改。
但是需要注意的是,C++
里面所有的临时对象都是const
类型的,所以说在函数使用引用来传递参数的时候,很容易发生传入的是const
常量,但是函数里面定义的却是变量,一个常量一个变量时类型不同,是无法使用引用的:
1 | void Str(string &s1) |
上面代码在使用引用来传递参数的时候,就发生了编译错误,就是因为函数Str()
在引用传入的临时对象"Xorex"
的时候,"Xorex"
是一个const
类型的不可改变常量,但是s1
是string
类型的变量,因为类型不同,所以就没有办法引用。
把string
更改为const string
就可以了:
1 | void Str(const string &s1) |
这里是在函数里面使用引用非常容易犯的错误!!!
更详细的一些知识:C++引用的简单理解