C++语言基础(8)-引用

news/2024/7/5 18:24:56

 

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

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 <iostream>
using namespace std;

int main(){
    int a = 99;
    int &b = a;
    cout<<a<<", "<<b<<endl;
    cout<<&a<<", "<<&b<<endl;

    return 0;
}

运行结果:
99, 99
0x28ff44, 0x28ff44

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

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

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

二.引用作为函数参数

#include <iostream>
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<<num1<<" "<<num2<<endl;

    return 0;
}

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

运行结果:

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

三.引用作为函数返回值


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

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

运行结果:

20 20

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

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

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

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

 


http://www.niftyadmin.cn/n/4079378.html

相关文章

MySQL 的相关介绍

MySQL 的相关介绍 &#xff1a;在介绍MySQL之前先弄清楚两个概念:数据库&#xff1a;与DB相关的物理操作系统文件和其他形式文件的集合 实例&#xff1a;包括与MySQL相关的后台线程和共享内存区 在一般情况下一个实例仅仅对应于一个数据库的&#xff0c;像类似于高可用性集群的…

Linux编程之有限状态机FSM的理解与实现

有限状态机&#xff08;finite state machine&#xff09;简称FSM&#xff0c;表示有限个状态及在这些状态之间的转移和动作等行为的数学模型&#xff0c;在计算机领域有着广泛的应用。FSM是一种逻辑单元内部的一种高效编程方法&#xff0c;在服务器编程中&#xff0c;服务器可…

摩拜获巨额融资,为何还被曝拖欠底层员工薪水?

当前的中国互联网圈子一直不缺劲爆话题&#xff0c;共享单车尤是风口浪尖。如果关注或是搜索共享单车相关关键词&#xff0c;满屏的利好消息顿时便会充斥整个屏幕&#xff0c;让人一眼看去其乐融融和谐无边的景象几乎直截了当的告诉读者&#xff1a;共享单车是太阳底下最灿烂的…

Codeforces Round #420 (Div. 2)

这一场PP说很简单&#xff0c;我就闲来无事敲一敲好了&#xff0c;反正也考完了&#xff08;雾&#xff0c;不过只剩数据结构和cA. Okabe and Future Gadget Laboratorytime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outp…

java 二项式系数_Binomial Coefficient(二项式系数)

In mathematics, any of the positive integers that occurs as a coefficient in the binomial theorem is a binomial coefficient. Commonly, a binomial coefficient is indexed by a pair of integers n ≥ k ≥ 0 and is written {\displaystyle {\tbinom {n}{k}}.} {\di…

Centos7下安装Tomcat7

在这里我们采用下载tar.gz包来进行安装。 首先先到Apache Tomcat官网上下载Tomcat&#xff0c;这里我们使用Tomcat 7。 下载地址为&#xff1a; http://tomcat.apache.org/download-70.cgi 下载完成之后进行解压 # tar –zxvf apache-tomcat-7.0.78.tar.gz 然后&#xff0c;选择…

好人不长命 祸害遗千年

活到今天的人各种各样都有&#xff0c;也没有哪种人完全绝种了&#xff0c;世界之大&#xff0c;无奇不有&#xff0c;如果你有机会多见到一些人&#xff0c;就会发现大圣大贤和大奸大恶现在都还存在着生存的罪恶么&#xff0c;要看你怎么生存&#xff0c;也要看你怎么定义罪恶…

java接口向接口传递图片_通过java调用Http接口上传图片到服务器

/*** 测试上传png图片**/public static voidtestUploadImage(){String url "http://localhost:8080/app/remindDetails/doRepair.xhtml";String fileName "E:\\工作\\项目\\奇瑞只能制造信息化系统\\工作安排\\接口设计(20171113-)\\1.5.png";Map textMap …