C++ 引用 vs 指针区别:
引用很容易与指针混淆,它们之间有三个主要的不同:
不存在空引用。引用必须连接到一块合法的内存。
一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
引用必须在创建时被初始化。指针可以在任何时间被初始化。
总结: &的作用
1. 取址
2. 引用:
我们可以为 i 声明引用变量,如下所示:
int& r = i;double& s = d;
在这些声明中,& 读作引用。因此,第一个声明可以读作 "r 是一个初始化为 i 的整型引用",
第二个声明可以读作 "s 是一个初始化为 d 的 double 型引用"。下面的实例使用了 int 和 double 引用:
#include<iostream>
usingnamespacestd;
intmain()
{
// 声明简单的变量
inti;
doubled;
// 声明引用变量
int&r=i;
double&s=d;
i=5;
cout<<"Value of i : "<<i<<endl;
cout<<"Value of i reference : "<<r<<endl;
d=11.7;
cout<<"Value of d : "<<d<<endl;
cout<<"Value of d reference : "<<s<<endl;
return0;
}
当上面的代码被编译和执行时,它会产生下列结果:
Valueofi:5
Valueofireference:5
Valueofd:11.7
Valueofdreference:11.7
引用的3种使用:
1. 把引用作为参数
#include<iostream>
usingnamespacestd;
// 函数声明
voidswap(int&x,int&y);
intmain()
{
// 局部变量声明
inta=100;
intb=200;
cout<<"交换前,a 的值:"<<a<<endl;
cout<<"交换前,b 的值:"<<b<<endl;
/* 调用函数来交换值 */
swap(a,b);
cout<<"交换后,a 的值:"<<a<<endl;
cout<<"交换后,b 的值:"<<b<<endl;
return0;
}
// 函数定义
voidswap(int&x,int&y)
{
inttemp;
temp=x;/* 保存地址 x 的值 */
x=y;/* 把 y 赋值给 x */
y=temp;/* 把 x 赋值给 y */
return;
}
如果是通过指针, 写法如下:
分别通过引用和指针:修改变量的值
void getByYinyong(long& ptr){
ptr=9;
cout << "引用修改的值:" << ptr << endl;
}
int main ()
{
long sec;
long temp;
cout << "temp 值:" << temp << endl;
// 出来的结果是: 4365430512, 为啥不是0
cout << "Number of seconds before 值:" << sec << endl;
getSeconds(&sec);
// 输出实际值
cout << "Number of seconds after:" << sec << endl;
// 通过引用入
getByYinyong(sec);
return 0;
}
void getSeconds(long *ptr){
*ptr=time(NULL);
return;
}
2. 把引用作为返回值 (重点)
当函数返回一个引用时,则返回一个指向返回值的隐式指针。这样,函数就可以放在赋值语句的左边。例如,请看下面这个简单的程序
#include<iostream>
usingnamespacestd;
doublevals[]={10.1,12.6,33.1,24.1,50.0};
double&setValues(inti) {
double&ref=vals[i];
returnref;// 返回第 i 个元素的引用,ref 是一个引用变量,ref 引用 vals[i]
}
// 要调用上面定义函数的主函数
intmain()
{
cout<<"改变前的值"<<endl;
for(inti=0;i<5;i++)
{
cout<<"vals["<<i<<"] = ";
cout<<vals[i]<<endl;
}
setValues(1)=20.23;// 改变第 2 个元素
setValues(3)=70.8;// 改变第 4 个元素
cout<<"改变后的值"<<endl;
for(inti=0;i<5;i++)
{
cout<<"vals["<<i<<"] = ";
cout<<vals[i]<<endl;
}
return0;
}
第三种用法: 当指针的别名
{
int a=10;
int &b=a;
b=20;
cout << "a"<<a << endl;
cout << "b"<<b << endl;
cout << "a&"<<&a << endl;
cout << "b&"<<&b<< endl;
}
结果:
a20
b20
a&0x7ffdbce0bc04
b&0x7ffdbce0bc04
常量指针:不可以修改,智能读取.可以防止别人修改.
举例:
引用的用法: 在拷贝构造函数中!
Line( const Line &obj); // 拷贝构造函数
在什么时候需要使用“常引用”?
如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。
常引用声明方式:const 类型标识符 &引用名=目标变量名;
模版中用到了常引用
inlineTconst&Max(Tconst&a,Tconst&b)
{
returna<b?b:a;
}