引用reference

求地址运算符 &

C++里面,如果想要得到找到一个变量的地址,就可以使用&variable来实现,比如:

1
2
3
4
5
6
int main()
{
int a=123123;
cout<<&a<<endl;
return false;
}

运行结果就是:0x61fe9c,返回的这个地址类型是int*,也就是指针类型,可以被指针变量保存。

引用 reference

基本用法

  • C++里面有引用功能,说白了就是别名,其本质上就是给一个变量再起一个名字,使用方法就是&new_variable=declared_variable。这样new_variabledeclared_variable就是同一个变量,占用一个内存空间,使用任意一个名字更改值,另一个调用值也会变。
1
2
3
int a=10,&b=a,&c=b;
b=20; c=30;
cout<<a<<' '<<b<<' '<<c<<endl;

注意

  1. &不是求地址运算符,而是起标志作用

  2. 引用的类型必须和其所绑定的变量的类型相同

上面声明的三个变量是同一个变量,使用同一个内存空间,无论用哪一个变量名赋值,输出三个的值都是一样的。

  • 引用主要用于在函数传入参数的时候,可以把实参传过去。这样就不用生成一个形参,也可以顺便更改实参的值。节省代码量和空间开销。
1
2
3
4
5
6
7
8
9
10
11
12
13
void Xorex(int &a,int &b,int &c)
{
a=10;
b=20;
c=30;
}
int main()
{
int a=false,b=false,c=false;
Xorex(a,b,c);
cout<<a<<' '<<b<<' '<<c<<endl;
return false;
}

这样被传入的a,b,c的值都会改变,最终结果就是10 20 30

数组引用

在对数组进行引用的时候,格式有些不同,需要使用(&new_variable)[Num]=declared_variable,而且new_variable数组的空间大小必须要和declared_variable数组的空间大小相同。

1
2
3
4
5
6
7
8
int main()
{
int a[3]={1,2,3};
//下面注意空间大小要和被引用的数组空间大小相同
int (&b)[3]=a;
cout<<a<<' '<<b<<endl;
return false;
}

你就会发现输出的两个数组的地址一模一样,引用成功。


引用还可以对指针类型的引用,语法:类型 *&引用名=指针名; 也可以理解成指针的类型为:类型*,比如int*

一定要注意变量的类型要统一啊!!!

1
2
3
4
5
6
7
8
int main()
{
int a=1;
int *b=&a;
int *&c=b;
cout<<&a<<' '<<b<<' '<<c<<endl;
return false;
}

结果输出的三个地址是一样的。

常引用

常引用不允许通过该引用对其所绑定的变量或对象进行修改,也就是说只能通过原变量名改变这个地址所存储的值,而不能通过引用的变量进行更改:

1
2
3
4
5
6
7
8
int main()
{
int a=1;
const int &b=a;
b=12;
cout<<a<<' '<<b<<endl;
return false;
}

上面的代码编译就会报错 error: assignment of read-only reference b,同时常声明 const 对于任何类型声明都有效,可以保证所声明的变量无法被更改。


但是需要注意的是,C++里面所有的临时对象都是const类型的,所以说在函数使用引用来传递参数的时候,很容易发生传入的是const常量,但是函数里面定义的却是变量,一个常量一个变量时类型不同,是无法使用引用的:

1
2
3
4
5
6
7
8
9
10
11
void Str(string &s1)
{
cout<<s1<<endl;
}
int main()
{
string One="Xorex";
Str(One);
Str("Xorex");
return false;
}

上面代码在使用引用来传递参数的时候,就发生了编译错误,就是因为函数Str()在引用传入的临时对象"Xorex"的时候,"Xorex"是一个const类型的不可改变常量,但是s1string类型的变量,因为类型不同,所以就没有办法引用。

string更改为const string就可以了:

1
2
3
4
void Str(const string &s1)
{
cout<<s1<<endl;
}

这里是在函数里面使用引用非常容易犯的错误!!!

更详细的一些知识:C++引用的简单理解