C++引用与指针

来源:互联网 发布:术大师淘宝论坛 编辑:程序博客网 时间:2024/05/21 00:18

C++一开始接触到的就是引用这个概念。初次接触,对引用现在有了一定的了解。

引用(reference):某一变量的别名。

我们现在所了解到的引用主要是左值引用,除此之外还有右值引用。借此机会,我也了解了一下左值与右值的区别。

左值:必须在内存中存在实体(++a是左值引用
右值:存放在寄存器、cpu中(a++是右值引用
区分二者最简单的方法就是看能否取地址,左值可以取地址而右值不可以。

int a = 10;int &ra = a;

上面的代码块便是引用的格式:类型 &引用变量名=已定义过的变量名;
ra便是a的引用,也就是说,ra是a的别名,两者的作用相同。
对a进行操作与对ra进行操作结果完全相同。二者具有相同的地址。

引用的注意事项:

1.一个变量可以取多个别名
2.引用必须初始化且只能初始化一次,不能再改为其他变量的引用
3.加上const的引用更加安全
4.可以把引用绑定到const对象上,称作对常量的引用,但是不能通过对常量的引用来修改它所绑定的对象。
5.不能建立void类型的引用
6.可以用常量或者表达式对引用进行初始化,但必须是const引用
7.包含隐式类型转换

float d = 12.34int &rd = d;//d是double类型,rd是int类型,d赋给rd时会产生一个临时变量,也就是说rd会引用这个具有常性的临时变量,所以不能赋值。

数组的引用

int a[10] = { 0 };int(&ra)[10] = a;

二维数组

int a[3][4] = { 0 };int(&ra)[3][4] = a;

引用作为函数参数

例如:交换两个整形常量

void swap(int &a,int &b){    int tmp = a ;    int a = b;    int b = tmp;}int main(){    int a = 10;    int b = 20;    swap(a, b);    return 0;}

若采用传值调用,占用空间大还无法交换二者的值。
若采用传址调用,指针变量要另外开辟内存单元,其内容是地址。而引用变量不是一个独立的变量,不需要单独占内存单元,它是实参的别名。
引用调用的效率比以上二者的效率都要高。

若不希望函数调用过程中改变实参的值,可在引用前加const限定。

引用作为返回值

int &Add(const int & a, const int & b){    int ret = 0;    ret = a + b ;    return ret;}

ret是个临时变量,函数结束便销毁了,此处函数返回一个临时变量,必然会出错。
要返回一个出了函数作用于的对象的引用。

指针和引用的区别

1.引用只能在定义时初始化一次 ,之后再不能与其他变量绑定。指针变量的值可变。
2.引用必须指向有效的变量,而指针可以为空。
3.sizeof在求取指针对象和引用对象的值不同,sizeof引用得到的是所引用对象的大小,sizeof指针得到的是对象的地址大小。
4.引用时(++)和(–)相当于给变量自增自减,给指针进行自增自减则会改变指针的指向。
5.相对而言引用比指针更加安全。

右值引用

int num = 20;int *&&rpnum = #

此处&num就是右值。因为右值是在寄存器上的,如果我们要把他拿出来,需要进行拷贝,早期的c++采用的就是在内存开辟一块空间进行拷贝,然后进行操作,但是这样的话太浪费空间与时间。
右值引用很好的节省了空间与时间。

0 0
原创粉丝点击