博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++语言基础(8)-引用
阅读量:5956 次
发布时间:2019-06-19

本文共 2726 字,大约阅读时间需要 9 分钟。

 

(重要)使用引用的一些注意点:

1.引用不能绑定临时数据,也不能绑定任何无法获取内存地址的常量,表达式,或值,常引用除外

第一种写法:(错误)

 

int func_int(){    int n = 100;    return n;}int main(){        int m = 100, n = 36;    int &r1 = m + n;    int &r2 = m + 28;    int &r3 = 12 * 3;    int &r4 = 50;    int &r5 = func_int();    return 0;}

 

第二种写法:

bool isOdd(int &n){    if(n/2 == 0){        return false;    }else{        return true;    }}int main(){    int a = 100;    isOdd(a);  //正确    isOdd(a + 9);  //错误    isOdd(27);  //错误    isOdd(23 + 55);  //错误    return 0;}

第三种写法(正确)

int func_int(){    int n = 100;    return n;}int main(){    int m = 100, n = 36;    const int &r1 = m + n;    const int &r2 = m + 28;    const int &r3 = 12 * 3;    const int &r4 = 50;    const int &r5 = func_int();    return 0;}

第四种写法:(正确)

bool isOdd(const int &n){  //改为常引用    if(n/2 == 0){        return false;    }else{        return true;    }}int a = 100;isOdd(a);  //正确isOdd(a + 9);  //正确isOdd(27);  //正确isOdd(23 + 55);  //正确

为什么加了const就可以?这是因为将常引用绑定到临时数据时,编译器采取了一种妥协机制:编译器会为临时数据创建一个新的、无名的临时变量,并将临时数据放入该临时变量中,然后再将引用绑定到该临时变量。注意,临时变量也是变量,所有的变量都会被分配内存。

 

2.const修饰引用时三种写法的区别:

第一种写法(错误

int a = 20;int & const r = a;

第二种写法(正确

int a = 20;int const &r = a;

第三种写法(正确

int a = 20;const int &r = a;

上述三种写法中,第一种写法是严重错误的。因为引用在定义时就必须初始化,并且以后也要从一而终,不能再指向其它数据,这也就意味着r本来就不能改变指向,加上const纯属多此一举

第二种写法和第三种写法本质上是一样的,在定义引用时加上const限制,目的都是不希望通过引用来修改原始数据的值

 

 

一.引用的基本用法

#include 
using namespace std;int main(){ int a = 99; int &b = a; cout<
<<", "<<

运行结果:

99, 99
0x28ff44, 0x28ff44

如果不希望通过引用修改原始数据的值,可以在定义时添加const限制:

const int &b = a; // 或int const &b = a;

注意:引用在定义时需要添加&,在使用时不能添加&,使用时添加&表示取地址

二.引用作为函数参数

#include 
using namespace std;void swap3(int &a, int &b);int main(){ int num1, num2; cout<<"Input two integers: "; cin>>num1>>num2; swap3(num1, num2); cout<
<<" "<
<

运行结果:

Input two integers: 12 34

12 34
Input two integers: 88 99
99 88
Input two integers: 100 200
200 100

三.引用作为函数返回值

引用除了可以作为函数形参,还可以作为函数返回值,请看下面的例子:

#include 
using namespace std;int &plus10(int &n){ n = n + 10; return n;}int main(){ int num1 = 10; int num2 = plus10(num1); cout<
<<" "<
<

运行结果:

20 20

注意:在将引用作为函数返回值时应该注意一个小问题,就是不能返回局部数据(例如局部变量局部对象局部数组等)的引用,因为当函数调用完成后局部数据就会被销毁,有可能在下次使用时数据就不存在了,C++ 编译器检测到该行为时也会给出警告。

因此像下面的写法是不正确的:

#include 
using namespace std;int &plus10(int &n){ int m = n + 10; return m; //返回局部数据的引用}int main(){ int num1 = 10; int num2 = plus10(num1); cout<
<

不能将局部变量m返回!因为函数是在栈上运行的,并且运行结束后会放弃对所有局部数据的管理权,后面的函数调用会覆盖前面函数的局部数据。本例中,第二次调用 plus10() 会覆盖第一次调用 plus10() 所产生的局部数据,第三次调用 plus10() 会覆盖第二次调用 plus10() 所产生的局部数据。

 

转载地址:http://vkrxx.baihongyu.com/

你可能感兴趣的文章
thinkphp数据表操作恐怖事件。
查看>>
C#重绘TabControl控件的源码(转)
查看>>
Just a test
查看>>
nginx 的启动、停止与重启
查看>>
matlab练习程序(高斯金字塔)
查看>>
HTML表格
查看>>
串口类QextSerialPort
查看>>
Linux定时任务Crontab命令详解
查看>>
1)vmware station 14下安装linux系统
查看>>
python day11
查看>>
poj - 2503 Babelfish
查看>>
使用Windows 8 的“任务计划”令HydraVision更加精彩
查看>>
Javascript-逻辑运算符(&&)
查看>>
5、urllib.request.urlopen()
查看>>
py2与py3差别
查看>>
windows知识点
查看>>
第五章多态课后java_Java程序设计课后练习答案
查看>>
idea无用插件_没用过这些IDEA插件?怪不得写代码头疼
查看>>
c语言点阵汉字放大缩小_汉字图形化设计手法!化形融意!
查看>>
安卓能硬改的手机机型_2020年末三款手机推荐,闭着眼都不会选错
查看>>