【带头学C++】----- 八、C++面向对象编程 ---- 8.7 引用(Reference)

news2024/12/24 11:06:06

     

目录

8.7 引用(Reference)

8.7.1 普通变量引用

8.7.2 数组引用

8.7.3 指针变量的引用方法

8.7.4 函数的引用

8.7.5 引用作为函数的参数

8.7.6 引用作为函数的返回值类型

1. 返回值类型不用使用局部变量的引用类型

2.返回值类型为引用,可以完成一系列操作链式操作

8.7.7 常引用

1、给常量取别名,不能通过常引用修改内容

2、常引用作为函数的参数:防止函数内部修改外部的值

     在C/C++中指针的作用基本都是一样的,但是C++增加了另外一种给函数传递地址的途径,这就是按引用传递(pass-by-reference)。变量名实质上是一段连续内存空间的别名,是一个标号(门牌号)程序中通过变量来申请并命名内存空间通过变量的名字,可以使用存储空间对一段连续的内存空间只能取一个别名吗?C++11开始以后新增了引用的概念,引用可以作为一个以及存在的对象的别名。

8.7 引用(Reference)

8.7.1 普通变量引用

引用的本质是对象的一个别名,即一个引用是对某个对象的另一个名称。

引用过程步骤:

1.&取个别名

2.给那个变量取别名,就定义一个相同的类型

3.从上往下整体替换

例如:

 int a = 10;   
 //给变量a取引用的别名,叫b   
int &b = a; //引用必须初始化

 

    int a = 10;

    //给变量a取引用的别名,叫b
    //定义的时候 &修饰变量为引用 b就是a的别名(引用)
    //编译器不会给引用的别名开辟空间
    int &b = a; //引用必须初始化
    //此时,a和b代表同一地址空间
    //1.看内容
    cout<<"a:"<<a<<endl;
    cout<<"b:"<<b<<endl;

    //2.看地址
    cout<<"&a:"<<&a<<endl;
    cout<<"&b:"<<&b<<endl;

    //3.操作引用对象b就是操作原始的对象a
    b = 100;
    cout<<"a2:"<<a<<endl;
    cout<<"b2:"<<b<<endl;

8.7.2 数组引用

    int arr[5] = {10, 20, 30, 40, 50};
    int n = sizeof(arr) / sizeof(arr[0]);
    int (&myArr)[5] = arr;
    int i = 0;

    for (i = 0; i < n; i++) {
        cout << myArr[i] << " ";
    }
    cout << endl;

8.7.3 指针变量的引用方法

    int num = 10;
    int *p = &num;

    int* &myP = p;
    std::cout << "*p = " << *p << std::endl;     // 输出:10
    std::cout << "*myP = " << *myP << std::endl;     // 输出:10

8.7.4 函数的引用

8.7.5 引用作为函数的参数

函数内部可通过引用操作外部的变量

例如:

void swap1(int *x,int *y){
    int temp = *x;
    *x = *y;
    *y = temp;
}

使用引用传参,需要直接传地址

void swap2(int &x,int &y){
    int temp = x;
    x = y;
    y = temp;
}

代码: 

void swap1(int *x,int *y){
    int temp = *x;
    *x = *y;
    *y = temp;
}

void swap2(int &x,int &y){
    int temp = x;
    x = y;
    y = temp;
}
void test07(){
    int a = 10;
    int b = 20;
    cout << "a = "<< a << ",b =" <<b<<endl;//

    //swap1(&a,&b);
    swap2(a,b);
    cout << "a = "<< a << ",b =" <<b<<endl;
}

引用的语法更清楚简单:
1) 函数调用时传递的实参不必加“&”符

2) 在被调函数中不必在参数前加“*”符 引用作为其它变量的别名而存在,因此在一些场合可以代替指针

3)C++主张用引用传递取代地址传递的方式,因为引用语法容易且不易出错。

8.7.6 引用作为函数的返回值类型

1. 返回值类型不用使用局部变量的引用类型

注意此时的引用对象的生命周期,局部变量的生命周期就只存活在该函数体之内的范围。 

2.返回值类型为引用,可以完成一系列操作链式操作

struct Stu{
    Stu& printstu(Stu &ob,int value){
        cout<<value<<" ";
        return ob;
    }
};

void test09(){
    Stu ob1;
    ob1.printstu(ob1,100).printstu(ob1,200).printstu(ob1,300);//100 200 300
}

8.7.7 常引用

1、给常量取别名,不能通过常引用修改内容

 

 

代码:

//int &num1 = 10;//error 不可以,
    const int& num = 10; //num 就是10的别名
    //num = 10 是错误的说法
    cout << num <<endl;//10

2、常引用作为函数的参数:防止函数内部修改外部的值

void printInt(const int &a){
    //a = 200;//err
    cout<<"a ="<<a<<endl;
}
void test11(){
    int num = 100;
    printInt(num);//a = 100
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1262802.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

es集群相关报错信息

给es集群添加用户密码的时候&#xff0c;会自动弹出相关的账户信息&#xff0c;这个时候&#xff0c;只需要设置对应密码就可以了 [esuserjky-test1 bin]$ ./elasticsearch-setup-passwords interactive future versions of Elasticsearch will require Java 11; your Java ve…

【Linux】了解进程的基础知识

进程 1. 进程的概念1.1 进程的理解1.2 Linux下的进程1.3 查看进程属性1.4 getpid和getppid 2. 创建进程3. 进程状态4. 进程优先级5. 进程切换6. 环境变量7. 本地变量与内建命令 1. 进程的概念 一个已经加载到内存中的程序&#xff0c;叫做进程&#xff08;也叫任务&#xff09…

2021年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题

文章目录 2021年全国硕士研究生入学招生考试英语二试题SectionⅠUse of EnglishSection Ⅱ Reading ComprehensionText 1Text 2Text 2Text 3Text 4 Section III TranslationSection Ⅳ Writing 2021年全国硕士研究生入学招生考试英语二试题 SectionⅠUse of English Directio…

vue项目多个不同的服务器请求地址管理

vue项目多个不同的服务器请求地址管理 在vue项目开发过程中,获取不同的数据可能会出现需要请求多个不同服务器地址的域名,这个时候需要对不同域名的请求地址进行管理以及跨域的代理。 一、单服务器域名地址的跨域代理和请求配置: 跨域配置: 在vue项目的vue.config.js文件…

GAN:ImprovedGAN-训练GAN的改进策略

论文&#xff1a;https://arxiv.org/abs/1606.03498 代码&#xff1a;https://github.com/openai/improved_gan 发表&#xff1a;NIPS 2016 一、文章创新 1&#xff1a;Feature matching&#xff1a;特征匹配通过为生成器指定新目标来解决GANs的不稳定性&#xff0c;从而防止…

很清楚展示GPT插件的调用过程,人工智能(AI)的潜在危险与好处 超级智能 未来

好处&#xff0c;未来 很清楚展示GPT插件的调用过程&#xff1a; 把请求和要求发chatGPT chatGPT返回markdown格式发给插件 插件返回结果给用户。 你不用别人用。 人工智能&#xff08;AI&#xff09;的最危险之处通常与以下几个方面有关&#xff1a; 自主决策能力过强&…

一篇博客带你了解TCP网络传输协议

Transmission Control Protocol&#xff08;TCP&#xff0c;传输控制协议&#xff09;是互联网协议套件中的一种主要协议之一&#xff0c;负责在网络上可靠地传输数据。下面是TCP协议的详细讲解&#xff1a; 1. 基本概念&#xff1a; 面向连接&#xff1a; TCP是一种面向连接的…

2.安装docker

目录 1 安装依赖 2 安装docker 3 测试 目前docker分为三类 Docker-CE(社区版),Docker-EE(企业版)和Moby。Moby是docker社区用户自己写的&#xff0c;所以Moby我们一般用不上 每一类的每一个版本中都有Edge与Stable版&#xff0c;Stable维护4个月&#xff0c;Edge维护1个…

在柯桥西班牙语论文写作,连接词只会用porquepero?西语连接词大全来啦~

Adicin -agregan nuevos datos al desarrollo de una idea o introduce otro aspecto del tema. 为观点的论述增添新的信息&#xff0c;或介绍主题的另一个方面。 1 Lista de conectores 连接词列表 Adems. As mismo. Hay que mencionar, adems. Habra que decir tambin. Mas …

当消费增值模式遇上Dapp:擦出创新商业的火花

随着区块链技术和智能合约的不断发展&#xff0c;去中心化应用&#xff08;Dapp&#xff09;逐渐成为一种创新的商业模式。当消费增值模式与Dapp相遇&#xff0c;它们之间擦出了怎样的火花呢&#xff1f; 一、Dapp与消费增值模式的结合 Dapp是一种基于区块链技术和智能合约的去…

分层理解Java字符串常量池

Java是一门计算机编程语言&#xff0c;但我们脑海中所理解的Java不仅仅是一门语言。它还包括Java虚拟机&#xff08;JVM&#xff09;的一系列规定&#xff0c;及具体Java产品&#xff08;如Hotspot&#xff09;的实现原理。 不管我们日常在Java中用到的任何一种语法&#xff0…

python如何抓取携程酒店的价格,让工作更简单点

有时候老板没事安排点事&#xff0c;为了偷懒&#xff0c;只能使出大招&#xff0c;毕竟自己不是那么老老实实干活的人&#xff0c;整理数据这类累和繁琐的活&#xff0c;我怎么能轻易动&#xff0c;好在gpt可以帮我来实现&#xff0c;有人可能会说&#xff0c;这么点内容你还不…

在线陪诊系统: 医疗科技的崭新前沿

在医学科技的快速发展中&#xff0c;在线陪诊系统正成为医疗服务领域的创新力量。通过结合互联网和先进的远程技术&#xff0c;这一系统为患者和医生提供了更为便捷、高效的医疗体验。本文将深入探讨在线陪诊系统的技术背后的核心代码和实现原理。 技术背后的关键代码 在线陪…

面试题:说一下MyBatis动态代理原理?

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.MyBatis简介2.使用步骤2.1、引入依赖2.2、配置文件2.3、接口定义2.4、加载执行 3.原理解析 1.MyBatis简介 MyBatis是一个ORM工具&#xff0c;封装了JDBC的操作&a…

k8s中pod的hostport端口突然无法访问故障处理

故障背景&#xff1a; 租户告知生产环境的sftp突然无法访问了&#xff0c;登录环境查看sftp服务运行都是正常的&#xff0c;访问sftp的hostport端口确实不通。 故障处理过程 既然访问不通那就先给服务做个全面检查&#xff0c;看看哪里出了问题&#xff0c;看下sftp日志&#…

Java学习路线第二篇:Java Web

这篇则分享Java学习路线第二part&#xff1a;Java Web 恭喜你已经成功追到第二章节啦&#xff0c;要被自己的努力感动到了吧&#xff0c;而这节将承担起学完Java web 的使命&#xff0c;本使命为单向契约&#xff0c;你可选择YES或者选择YES。 HTMLCSSJavaScript(JS) 【动…

Linux—进程状态、僵尸进程、孤独进程、优先级

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、进程状态二、僵尸进程、孤儿进程1、Z(zombie)-僵尸进程2、僵尸进程危害3、孤儿进程 三、进…

DHCP协议及实验omnipeek抓包工具分析 IPv4协议

一 抓包命令 adb shell tcpdump -i wlan0 -w /data/tcpdump.pcap 抓包后截图如下 二 DHCP是什么 2.1 DHCP定义 DHCP( Dynamic Host Configuration Protocol, 动态主机配置协议)定义: 存在于应用层(OSI) 前身是BOOTP(Bootstrap Protocol)协议 是一个使用UDP(User …

【沁恒蓝牙mesh】程序烧录 硬件电路设计与原理

本文基于沁恒CH58X 单片机的程序烧录硬件电路设计原理解释 【沁恒蓝牙mesh】目录 1. 程序烧录方式2. USB 烧录过程描述3. 硬件设计原理图3.1 官方开发板原理图3.2 自开发设计原理图 4. 电容在上电瞬间为什么相当于短路&#xff1f; &#x1f4cb; 个人简介 &#x1f496; 作者简…

关于AM5系列微机保护装置在某产业园配电工程中的应用-安科瑞 蒋静

1 摘要 目前&#xff0c;微机保护装置广泛应用于电力系统中&#xff0c;该类装置能够合理监测电力系统的运行状况&#xff0c;并实时记录电力系统出现故障的位置及性质&#xff0c;从而为故障的快速处理提供合理的参考信息。本文介绍的AM5系列微机保护装置&#xff0c;可以针对…