C++核心编程之引用的使用与介绍

news2024/10/6 5:55:22

目录

一、引用的基本语法

引用介绍

引用说明

二、引用的注意事项

三、引用做函数参数

四、引用做函数的返回值

五、引用的本质

六、常量引用


一、引用的基本语法

引用介绍

C++是C语言的继承,它可进行过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。引用(reference)就是C++对C语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名;

引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。

引用说明

(1)&在此不是求地址运算,而是起标识作用。

(2)类型标识符是指目标变量的类型

(3)声明引用时,必须同时对其进行初始化。

(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。

int a=2,&ra=a;

a为目标原名称,ra为目标引用名。给ra赋值:ra=1; 等价于 a=1;

(5)对引用求地址,就是对目标变量求地址。&ra与&a相等。即我们常说引用名是目标变量名的一个别名。别名一词好像是说引用不占据任何内存空间。但是编译器在一般将其实现为const指针,即指向位置不可变的指针。即引用实际上与一般指针同样占用内存。

(6)不能建立引用的数组。因为数组是一个由若干个元素所组成的集合,所以无法建立一个由引用组成的集合。但是可以建立数组的引用.

例如: int& ref [3]= {2,3,5};//声明ref引用的数组错误

但是可以这样写:

1

2

const int (&ref)[3] ={2,3,5}; //gcc编译的时候加上选项 -std=c++0x

ref[0] = 35; //错误

为什么要加上const ,因为{2,3,5}此时是个字面值数组,是保存在代码段里,只读的属性,如果不加,编译错误,而且后面对ref[0]的赋值也不会成功.

需要特别强调的是引用并不产生对象的副本,仅仅是对象的同义词。因此,当下面的语句执行后:

pt1.offset(12,12);

pt1和pt2都具有(12,12)的值。

引用必须在定义时马上被初始化,因为它必须是某个东西的同义词。你不能先定义一个引用后才

初始化它。例如下面语句是非法的:

Point &pt3;

pt3=pt1;

引用的本质就是给一个变量起别名

语法:数据类型  &别名 = 原名

图示:

示例:

#include<iostream>

using namespace std;

int main()

{

    // 引用基本语法

    // 数据类型  &别名  =  原名



    int a=10;

    // 创建引用

    int &b=a;

    cout<<"a="<<a<<endl;

    cout<<"b="<<b<<endl;



    b=100;

    cout<<"通过b修改后a,b的值"<<endl;

    cout<<"a="<<a<<endl;

    cout<<"b="<<b<<endl;

    return 0;

}

运行结果:

二、引用的注意事项

引用必须初始化

引用在初始化后,不可以改变

图示:

示例:

#include<iostream>

using namespace std;

int main()

{

    int a=10;

    int &b;

    // 1、引用必须初始化

    // 2、引用在初始化后,不可以改变

    return 0;

}

错误显示:

示例:

#include<iostream>

using namespace std;

int main()

{

    int a=10;

    // 1、引用必须初始化

    int &b=a;

    // 2、引用在初始化后,不可以改变

    int c=20;



    b=c;  // 赋值操作,而不是更改引用

    cout<<"a="<<a<<endl;

    cout<<"b="<<b<<endl;

    cout<<"c="<<c<<endl;



    return 0;

}

运行结果:

三、引用做函数参数

作用:函数传参时,可以利用引用的技术让形参修饰实参

优点:可以简化指针修改实参

总结:通过引用参数产生的效果同按地址传递是一样的。引用的语法更清楚简单。

示例:

#include<iostream>

using namespace std;

// 交换函数

// 1、值传递

void mySwap01(int a,int b)

{

    int temp=a;

    a=b;

    b=temp;

    cout<<"值传递中a="<<a<<endl;

    cout<<"值传递中b="<<b<<endl;

}

// 2、地址传递

void mySwap02(int *a,int *b)

{

    int temp=*a;

    *a=*b;

    *b=temp;

    cout<<"地址传递中a="<<*a<<endl;

    cout<<"地址传递中b="<<*b<<endl;

}

// 3、引用传递

void mySwap03(int &a,int &b)

{

    int temp=a;

    a=b;

    b=temp;

    cout<<"引用传递中a="<<a<<endl;

    cout<<"引用传递中b="<<b<<endl;

}

int main()

{

    cout<<"值传递"<<endl;

    int a=10;

    int b=20;

    mySwap01(a,b);// 值传递

    cout<<"a="<<a<<endl;

    cout<<"b="<<b<<endl;



    cout<<endl<<"地址传递"<<endl;

    mySwap02(&a,&b);// 地址传递

    cout<<"a="<<a<<endl;

    cout<<"b="<<b<<endl;



    cout<<endl<<"引用传递"<<endl;

    mySwap03(a,b);// 引用传递,形参会修饰实参的

    cout<<"a="<<a<<endl;

    cout<<"b="<<b<<endl;

    return 0;

}

运行结果:

四、引用做函数的返回值

作用:引用是可以作为函数的返回值存在的

注意:不要返回局部变量引用

用法:函数调用作为左值

示例:

#include<iostream>

using namespace std;

// 引用做函数的返回值

// 1、不要返回局部变量的引用

int& test01()

{

    int a=10; // 局部变量存放在四区中的栈区

    return a;

}

// 2、函数的调用可以作为左值

int& test02()

{

    static int a=10;// 静态变量,存放在全局区,全局区上的数据在程序结束后由系统释放

    return a;

}

int main()

{

    int &ref=test01();

    cout<<"ref="<<ref<<endl;// 第一次结果正确,是因为编译器对栈区返回的数据做了保留

    cout<<"ref="<<ref<<endl;// 第二次结果错误,因为a的内存已经释放



    int &ref2=test02();

    cout<<"ref2="<<ref2<<endl;

    cout<<"ref2="<<ref2<<endl;

    test02()=1000;// 如果函数的返回值是引用,这个函数调用可以作为左值

    cout<<"ref2="<<ref2<<endl;

    cout<<"ref2="<<ref2<<endl;

    return 0;
    
}

test01错误显示:

运行结果:

 

 

五、引用的本质

本质:引用的本质在C++内部实现是一个指针常量

结论:引用的本质是指针常量,但是所有的指针操作编译器都帮我们做好了,不需要解引用

示例:

#include<iostream>

using namespace std;

// 发现是引用,转换为int* const ref =&a;

void func(int &ref)

{

    ref=100;//ref是引用,转换为 *ref=100;

}

int main()

{

    int a=10;



    // 自动转换为 int* const ref=&a;指针常量是指针指向不可以更改,也说明为什么引用不可以更改

    int &ref=a;

    ref=20;// 内部发现ref是引用,自动帮我们转换为: *ref=20;

    cout<<"a="<<a<<endl;

    cout<<"ref="<<ref<<endl;



    func(a);

    cout<<"a="<<a<<endl;

    cout<<"ref="<<ref<<endl;

    return 0;

}

运行结果:

六、常量引用

作用:常量引用主要用来修饰形参,防止误操作

在函数参数列表中,可以加const修饰形参,防止形参改变实参

示例:

#include<iostream>

using namespace std;

// 打印数据函数

void showValue(const int &val)

{

    //val=1000;// 报错,必须是可修改的左值

    cout<<"val="<<val<<endl;

}

int main()

{

    // 常量引用

    // 使用场景:用来修饰形参,防止误操作



    // int a=10;

    // int &ref=10;// 引用必须引用一块合法的内存空间



    // 加上const之后,编译器将代码修改,int temp =10;const int &ref=temp;



    const int &ref=10;

    // ref=20;// 加入const之后变为只读,不可以修改



    int a=100;

    showValue(a);

    cout<<"a="<<a<<endl;

    return 0;

}

形参列表加入const之后,报错显示

运行结果:

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

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

相关文章

(Docker) Compose Plugin For OMV6

omv6:omv6_plugins:docker_compose [omv-extras.org] Summary概述 Docker is a technology that enables the creation and use of Linux containers. A container is a closed environment where one or more applications and their dependencies are installed, grouped and…

浏览器种输入一个url到显示页面全过程

所谓的‘三颗树’ 在浏览器中&#xff0c;当解析和加载网页时&#xff0c;会形成三个重要的树结构&#xff1a;DOM树、CSSOM树和渲染树&#xff08;Render Tree&#xff09;。这些树结构在网页的渲染和布局过程中起到关键作用。 DOM树&#xff08;Document Object Model Tree&…

亿发软件:释放智能仓储的力量,WMS智能仓储管理系统提升动态储存

在仓储管理领域&#xff0c;智能仓储的概念已经成为游戏规则的改变者。借助信息化、物联网和机电一体化的力量&#xff0c;智能仓库正在给行业带来变化。这些先进设施显著增加了仓储管理能力。在本文中&#xff0c;我们将探讨智能仓库的关键优势&#xff0c;了解采用WMS智能仓储…

【文生图系列】文生图大模型合集与效果对比

文章目录 DELL EDELL E 1DELL E 2 ERNIE-ViLGERNIE-ViLG 1ERNIE-ViLG 2Paddlehub ImagenMidjourneyStable DiffusionAltDiffusioneDiff-I阿里通义 DELL E DALLE到目前为止有两个版本&#xff0c;2021年1月&#xff0c;OpenAI发布了DALLE&#xff1b;2022年,DALLE 迎来了升…

Jersey框架学习

一、入门 controller package com.itheima.controller;import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType;Path("/person") public class PersonResource {GETProduces(MediaType.TEXT_PLAIN)pub…

【微笑女王-InsCode Stable Diffusion 美图活动一期】

文章目录 一、 Stable Diffusion 模型在线使用地址二、模型相关版本和参数配置三、图片生成提示词与反向提示词四、种子及对应图片 一、 Stable Diffusion 模型在线使用地址 https://inscode.csdn.net/inscode/Stable-Diffusion 操作步骤&#xff1a; 点击Stable Diffusion …

数据结构进阶(一):AVL树

所谓的AVL树也叫做高度平衡的二叉搜索树。 啥是高度平衡的二叉搜索树&#xff1f; 高度平衡的二叉搜索树&#xff1a;意味着左右子树的高度最大不超过一。 我们先来回顾一下二叉搜索树的概念&#xff1a; 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c…

Git 分支详解

一、分支概念介绍 1. 主分支&#xff08;主干/主线/main/master&#xff09; 包含所有最终修改的历史&#xff0c;反映项目的最终版本。 建议不要乱动主干&#xff0c;如果你编辑了一个小组项目的主干分支&#xff0c;你的改动会影响到其他人&#xff0c;而且很快就会出现合并…

jmeter负载测试如何找到最大并发用户数

在性能测试中&#xff0c;当我们接到项目任务时&#xff0c;很多时候我们是不知道待测接口能支持多少并发用户数的。此时&#xff0c;需要我们先做负载测试&#xff0c;通过逐步加压&#xff0c;来找到最大并发用户数。那么当我们找到一个区间&#xff0c;怎么找到具体的值呢&a…

实验室仪器管理系统/基于微信小程序的实验室仪器管理系统

摘 要 随着当今网络的发展&#xff0c;时代的进步&#xff0c;各行各业也在发生着变化&#xff0c;于是网络已经逐步进入人们的生活&#xff0c;给我们生活或者工作提供了新的方向新的可能。 本毕业设计的内容是设计实现一个实验室仪器管理系统。使用微信开发者是以java语言…

<Java导出Excel> 1.0 Java实现Excel动态模板导出

思路&#xff1a; 1&#xff0c;先创建动态模板&#xff08;必须要在数据库建一张表&#xff0c;可随时修改模板&#xff09; 例如&#xff1a; 建表语句&#xff1a; CREATE TABLE list_table_header (headerName VARCHAR(100) NOT NULL,headerField VARCHAR(100) NOT NULL…

一起了解抖音共创功能:激发创意,合作共创更有趣的短视频

抖音共创功能是抖音短视频平台推出的一项创作工具&#xff0c;旨在鼓励用户通过合作共创来创作更有趣、创意的短视频内容。该功能于2020年11月上线&#xff0c;受到了广大用户的热烈欢迎。下面不若与众科技就来介绍一下抖音共创功能。 抖音共创功能允许用户邀请其他用户一同参与…

Neo4j图数据库的使用笔记

Neo4j图数据库的使用笔记 win系统安装Neo4j图数据库 安装准备&#xff1a; neo4j-3.4.0版本的zip包 找个目录解压安装zip包 启动neo4j 下载neo4j-3.4.0版本的zip包 可以去neo4j官网下载&#xff0c;也可以去微云数聚官网下载。 微云数聚是neo4j在国内的代理商。 解压到…

sql分组查询

多个相同去重 思路&#xff1a; 找where条件 分组 分组后过滤

java导入csv格式文件之身份证格式处理

一. 出现的问题 csv中的身份证号如下图&#xff1a; 导到数据库中的结果 因此怎样导入才能使身份证能够正常导入呢&#xff1f; 2. 解决方案 第一步&#xff1a; 选中身份证那一列 第二步&#xff1a; 右键选择&#xff0c;设置单元格格式 第三步&#xff1a; 数字列中&#x…

面试必问之锁的底层原理

sychrionzed的底层原理: 实例数据&#xff1a;存放类的属性数据信息&#xff0c;包括父类的属性信息&#xff1b; 对齐填充&#xff1a;由于虚拟机要求 对象起始地址必须是8字节的整数倍。填充数据不是必须存在的&#xff0c;仅仅是为了字节对齐&#xff1b;根据寻址优化算法 s…

开源免费多语言翻译模型

今天给大家介绍赫尔辛基大学开源免费的多语言翻译模型&#xff0c;赫尔辛基大学开发了1400多个多语种翻译模型&#xff0c;我们可以在Hugging Face网站上免费下载免费使用这些模型,今天我来介绍其中的中译英和英译中两个模型。 我机器的环境是win11,adaconda&#xff0c;pytho…

C++笔记之是否知道了一个数组首元素的地址就可以获取该整个数组?-合众新能源汽车面试官问题

C笔记之数组名和指针GPT问答记录 事前提要&#xff1a;前段时间去面合众新能源汽车&#xff0c;面试官说知道了一个数组首元素的地址&#xff0c;就可以获取该整个数组&#xff0c;我当时就困惑&#xff0c;不知道大小和长度&#xff0c;只知道地址怎么就能获取。但也没反驳面…

windows,win10去掉命令行窗口cmd选中内容后导致中断的问题

背景 cmd黑窗口被选中内容后&#xff0c;会暂时挂起/阻塞进程。如&#xff1a;node.js的一些命令&#xff0c;选中刷出的日志会导致请求阻塞、http请求后端api接口的日志被选中后也会阻塞 方法 左键点击cmd黑窗口左上角的图标&#xff0c;选择 “属性”&#xff08;要注意选…

9.3.1 【Linux】区块选择(Visual Block)

当我们按下 v 或者 V 或者 [Ctrl]v 时&#xff0c;这个时候光标移动过的地方就会开始反白&#xff0c;这三个按键的意义分别是&#xff1a; 9.3.2 多文件编辑 我们可以使用vim后面同时接好几个文件来同时打开&#xff0c;相关的按键有&#xff1a; 9.3.3 多窗口功能 分区窗口…