您的位置:首页 > 编程语言 > C语言/C++

c++引用的相关总结

2018-03-13 18:03 351 查看

c++引用的的相关总结

在c++中新增加了一个语法,叫引用。
引用是给一个已经定义好的变量取别名,这个别名本身并不创建空间。


一. 引用一般的格式是:

类型& 引用变量名=已定义过的变量;


例如:
int a=9;
int& b=a;
这两句的意思就是:先定义一个变量a,用b对a进行引用,b就是a的一个别名。


若是见到类型后跟一个 & 就是引用的意思,除了这种情况一般就都是取地址的意思。

二. 引用的特点:

1.一个变量可以取多个别名。

eg:

int a=9;
int & b=a;
int & c=a;
b,c都是a变量的别名。


-

2.引用必须初始化

- int & b;
- 不可以;因为b是引用变量名,没有初始化就不知道是给谁重命名。也没有内容。


3.引用只能在初始化的时候引用一次,不能改变为再引用其他的变量。

不能再引用其他变量指的是不能再做其他变量的别名,但是可以通过它改变被引用的变量的值。


三. 在引用中有一个比较重要的是被const修饰的引用。

若是被const修饰的变量,其引用就也要用const修饰

const int a=20;


要想引用这个a就必须要用const引用

const int& b=a;


还有要给常量取别名,也得必须用const修饰来引用。因为常量是不能被改的

const int & b=20;


int d=10;
①float e=d;
②float& f=d;


上面有①②两种情况,是不是都可以编译成功呢?
4000

①是c语言中的语法,隐式的类型转换。是可以的,能够运行的。



②float& f=d;错误

因为现在不是直接给d取别名,而是给中间的临时变量取别名,而中间的临时变量是个常量,所以不能直接用float&引用,而是需要用const float&引用。

四. 引用作为参数

这里我们需要比较一下各种方式的传参数。

1.值传递,如果形参不是用引用的传值方式,则就需要生成局部临时变量接受实参的值,在这个局部变量的生命周期到了之后,这个局部变量的值消失,并不能改变实参的值。

void swap(int a,int b);


2.若是需要改变实参的值,则就需要用指针传值,将实参的地址给生成的局部指针变量,可以直接在函数中对实参进行操作,可以读写,可以修改。

void swap(int *a,int *b);


3.引用传值,是对实参进行引用,不需要重新开辟空间,不用创建临时变量,而是直接可以对其操作。若是不想要实参的值被改变,就需要用const进行修饰,避免在函数内将实参的值改变了。

void swap(int& a,int& b);
void swap(const int& a,const int& b);


五. 引用做返回值

1)传值做返回值

int Add(int x,int y)


传值返回的方式



2)传引用做返回值

int& Add(int x,int y);




传引用的优点就是,可以不用创建临时变量,节省空间,但是也有缺点返回值非法。

那传引用返回是不是就没有存在的意义呢?

并不是,若返回值当出了函数,作用域没有消失,则就可以使用引用返回。比如当返回值为静态变量时。

六. 深入理解引用

这是直接的赋值。



这里是将b的内容放入到eax寄存器中.



语法上说引用并不需要创建临时变量,可是在汇编语句上能看出引用的实现是这样的一个过程:将被引用的 b 变量的地址给寄存器eax,再将eax中内容给a变量.

所以引用是在语法上不需要创建临时变量,但是在底层汇编实现上还是创建了变量的。

最后总结一下指针与引用的区别与联系

1.虽然引用的符号与取地址的符号相同但是并不是取地址的意思。

2.引用必须得初始化,而且只能被初始化一次,之后不能再改变去引用其他变量,指针就可以改变指向。

3.引用必须指向有效的变量,但是指针可以为NUll。

4.sizeof指针对象和引用对象的意义也不一样,sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。

5.指针和引用自增自减的意义的也不同,指针自增自减一次加或减所指类型的大小,而引用是对数本身加1或减1。

6.相对而言,引用比指针更安全,指针需要判空,空指针的解引用还有野指针,内存泄漏等问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: