C++引用

来源:互联网 发布:淘宝led灯外发加工真假 编辑:程序博客网 时间:2024/05/21 03:28

C++引用

一. 引用变量

int x = 3;int& xRef = x;//xRef就是x的另一个别名,使用xRef就是使用x当前值//对xRef赋值会改变x的值

创建一个引用时必须总是初始化它,但是对于类而言,需要在构造函数初始
化列表中初始化引用数据成员。

int& xRef; //error, 无法在类外声明一个引用而不初始化它

不能创建对未命名的值的引用,除非这个引用是一个const的值。

int& unnameref = 1; //errorconst int& unnameRef = 1; //ok

在引用初始化后无法改变引用所知变量,而只能改变变量的值。

指针的引用和指向引用的指针

int* pInt;int*& pRef = pInt;pRef = new int;*pRef = 5;

可以引用‘数组’,但‘引用数组’是非法的

int a[5];int(&b)[5](a);//ok/*引用数组*/int a=0,b=1,c=2;int& ra=a;int& rb=b;int& rc=c;int& a[3] = {ra,rb,rc}//error.非法的

二. 引用参数
C++默认的参数传递机制是按值传递: 函数接受参数副本,修改这些副本时,原参不 变。
引用允许作为函数的参数:按引用传递,如果引用被修改原参变量也会被修改。

void swap(int& a, int& b){    int temp = a;    a = b;    b = temp;}

可以这样使用它们

int x=1, y=2;swap(x, y);

就像常量无法初始化普通引用一样,不能将常量作为原始参数传递给引用形参

swap(1, 2);//error

三. 引用作为返回值

第一个原因是提高效率。返回对象的引用而不是返回整个对象可以避免不必要的复制
只有在涉及的对象在函数终止之后仍然存在的情况下才能使用。

第二就是 将返回值直接赋为左值,

int& add(int& a, int& b){    a = a + b;    return a;}int main(){    int a = 1, b = 2;    add(a, b) = 2;}

这种情况在运算符重载的灰经常使用。


四. 引用和指针

相比而言,引用可以使得程序整洁易于理解,且不存在无效的引用,也不需要显示
的解除引用。
大多数情况下应该使用引用而非指针,只有在需要改变所指地址时才需要 使用指针
因为无法改变引用所指的对象。


五. 引用函数指针

int add(int a, int b){    return a+b;}int  main(){    int(*p)(int a, int b)(add);    std::cout << p(1, 2) << std::endl;    int(* const &rp)(int a, int b)(p);//引用函数指针    std::cout << rp(1, 2) << std::endl;}

六. 右值引用

左值:可以获取地址的一个量
右值:所有不是左值的量,o(^▽^)o,例如常量值,临时值等

int a=1, b=2;//a+b  就是一个右值int& c = a+b;//error, 常量无法初始化普通引用int&& d = a+b; //ok,右值引用
int getdata(int&& num){    return num;}int main(){    int a = 1, b = 2;    cout<<getdata(a+1)<<endl;//可以这样    cout<<getdata(1)<<endl;//也可以这样    cout<<getdata(move(a))<<endl;//还可以这样    //move()的作用就是把左值转换为右值 }
0 0
原创粉丝点击