c++学习,引用-- 黑马笔记

2023-11-03

1.引用的基本使用

作用:给变量起别名
语法:数据类型 &别名 = 原名

注意事项

  • 引用必须初始化
  • 引用初始化之后不可以改变
    样例:
#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
    // 1.引用必须初始化
    int a = 10;
    int &b = a;

    //2.初始化后不可以改变
    int c = 20;
    b = c; // 赋值操作而不是更改引用
    cout << "a= " << a << endl;
    cout << "b= " << b << endl;
    
    system("pause");
    return 0;
}

2.引用做函数参数

作用:函数传参时,可利用引用计数让形参修饰实参
优点:简化指针修改实参
三种交换函数:

// 交换函数
//1.值传递
void swap01(int a, int b){
    int temp = a;
    a = b;
    b = temp;
}

// 2.地址传递
void swap02(int *a, int *b){
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 3.引用传递
void swap03(int &a, int &b){
    int temp = a;
    a = b;
    b = temp;
}

结果:

#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
    // 1.引用必须初始化
    int a = 10;
    int b = 20;
    // swap01(a, b); // 值传递,形参不会修饰实参
    // swap02(&a, &b);   // 地址传递,形参会修饰实参
    swap03(a, b); // 引用传递,形参会修饰实参
    cout << "a= " << a << endl;
    cout << "b= " << b << endl;
    system("pause");
    return 0;
}

总结:引用参数产生效果与地址传递是一样的,引用语法更简单。

3.引用做函数返回值

注意:

  • 不要返回局部变量的引用,局部变量存放在栈区,函数调用完成立即释放,第一次输出结果正确,是因为编译器做了保留,以后输出错误。
  • 如果函数返回值是引用,该函数调用可以作为左值。
  • 引用本质是一个指针变量,但所有指针操作由编译器完成。

示例代码:

#include<iostream>
#include<cstdlib>
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; 
    system("pause");
    return 0;
}

4.引用的本质

本质是c++内部实现的一个指针常量,c++推荐使用引用技术,但所有指针操作编译器自动完成。

int a = 10;
int &ref = a;
ref = 20;

自动转换为

int * const ref = &a;
*ref = 20;

5.常量引用

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

常量引用的声明:

	//int& ref = 10;  引用本身需要一个合法的内存空间,因此这行错误
	//加入const就可以了,编译器优化代码,int temp = 10; const int& ref = temp;
	const int& ref = 10;
	//ref = 100;  //加入const后不可以修改变量
	cout << ref << endl;

防止误操作

#include<iostream>
#include<cstdlib>
using namespace std;
// 打印数据函数
void showValue(const int &val){
    val = 100; // bug所在位置,加上const,val不可修改
    cout << "val =" << val << endl;
}

int main()
{
    int a = 10;
    showValue(a);
    cout << "a =" << a << endl;
    system("pause");
    return 0;

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++学习,引用-- 黑马笔记 的相关文章

  • 我们可以在 C# 中定义枚举的隐式转换吗?

    是否可以在 C 中定义枚举的隐式转换 可以实现这一目标的东西吗 public enum MyEnum one 1 two 2 MyEnum number MyEnum one long i number 如果没有 为什么不呢 有一个解决方案
  • 获取当前用户的 NetworkCredential (C#)

    我正在尝试从控制台应用程序调用 Web 服务 并且我需要向客户端提供System Net NetworkCredential object 是否有可能创建一个NetworkCredential启动应用程序的用户的对象而不提示输入用户名 密码
  • gets 和 scanf 有什么区别?

    如果代码是 scanf s n message vs gets message 有什么区别 似乎两者都获取消息的输入 基本区别 参考您的特定场景 scanf 遇到一个时结束接受输入whitespace newline or EOF gets
  • 以编程方式更改 Excel 中的字体(Trebuchet MS、Calibari)C#

    我目前正在使用一个 C 应用程序 该应用程序有一个将生成 Excel 文件的类 一切都很顺利 Excel 工作表上填充的数据具有 Times New Roman 字体 我想将其更改为其他字体 Calibari 我怎样才能以编程方式做到这一点
  • 指向指针的指针和指向二维数组的指针之间的区别

    如果我有一个二维数组 B 定义为 int B 2 3 1 3 5 2 4 6 Is int p B与 一样int p 3 B int f B printf d f 1 gives 5作为输出 同时printf d f 给出 1 作为答案 为
  • 如何处理作为参数传递到方法中的 Lambda 表达式 - C# .NET 3.5

    我对 Lambda 表达式的了解有点不稳定 虽然我可以编写使用 Lambda 表达式 又名 LINQ 的代码 但我正在尝试编写自己的方法 该方法采用一些 Lambda 表达式类型的参数 背景 我正在尝试编写一个方法 该方法从任何其他对象类型
  • ObjectTrackingEnabled 和 linq-to-sql

    I read here http www sidarok com web blog content 2008 05 02 10 tips to improve your linq to sql application performance
  • 用于 C/C++ 的独立跨平台 (Windows/Linux) 文件压缩?

    我正在寻找一个 最好是小的 C 或 C 开源库 我可以将其包含在我的 MIT 许可项目中 托管在 google 代码上 我是一名业余爱好 C C 程序员 所以我并不那么先进 但我只知道为名为 SA MP 的应用程序 适用于 Windows
  • ASP.NET 中的 thread.sleep

    我正在为我的网站模拟彗星实时馈送协议 因此在我的控制器中我添加 while nothing new before timeout Thread Sleep 1000 但我注意到添加此功能后整个网站变慢了 调试后我得出结论 当我打电话时Thr
  • 第三方引用的 dll 未被复制来构建

    我有一个第三方 net dll 被我的 dll 类库项目 A 引用和使用 我的控制台应用程序项目 B 引用项目 A 我的问题是第三方 dll 没有被复制到控制台应用程序项目 B 的构建中 这里有什么问题呢 我的 dll 类库中引用的第三方
  • 如何“全局”捕获对象实例中引发的异常

    我目前正在编写一个 winforms 应用程序 C 我正在使用企业库异常处理块 遵循我所看到的相当标准的方法 IE 在 Program cs 的 Main 方法中 我已将事件处理程序连接到 Application ThreadExcepti
  • WPF MVVM后台打印数据绑定问题

    我正在使用 wpf mvvm 开发一个销售点应用程序 在交易生命周期的许多阶段 都会在后台打印收据 我已经使用其他示例在后台生成和打印收据 我正在后台打印一个 UserControl 一切看起来都很棒 然后 我为该控件创建了 ViewMod
  • 实体框架中的导航属性是什么

    我是实体框架的新手 当Visual Studio创建模型图时我们主要可以看到Entities Propertie和Navigation Properties这两个东西 那么这些Navigation Properties是什么 如何使用它们
  • 简单的喷射器将具体类型与生活方式结合起来

    我正在寻找一种可以使用指定的生活方式注册具体类型的方法 基本上如下所示 public void SomeFunction Type concrete Lifestyle lifestyle gt container Register con
  • 如何在 Windows 8.1 上打开多个 Visual Studio 窗口? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我使用的是 Windows 7 我能够启动多个 Visual Studio 并同时工作 现在我有 Windows 8 1 操作系统 每当我
  • Subsonic 3 ActiveRecord 嵌套选择导致 NotIn 错误?

    我有以下 Subsonic 3 0 查询 其中包含嵌套的 NotIn 查询 public List
  • 如何进行平衡组捕获?

    假设我有这个文本输入 tes tR R abc aD mnoR xyz 我想提取 ff 输出 R abc R xyz D mnoR xyz R R abc aD mnoR xyz 目前 我只能使用平衡组方法提取组内的内容 如中所示msdn
  • 使用反射检测属性的访问修饰符类型

    我编写了一些代码来使用反射查看属性 我已经使用反射从类中检索了属性列表 但是我需要查明该财产是公共的还是受保护的 例如 public string Name get set protected int Age get set Propert
  • 从不同的线程访问对象

    我有一个服务器类 它基本上等待来自客户端的连接 在该类中 我创建了一个 NetworkStream 对象 以便能够从客户端接收字节 由于 NetworkStream Read 方法不是异步的 这意味着它将等到从客户端读取字节才能继续执行类似
  • 有关 Endian 性和 .Net 的详细信息?

    我有几个关于字节顺序的问题 这些问题足够相关 我保证将它们作为一个问题提出 1 字节顺序是由 Net还是由硬件决定的 2 如果是由硬件决定的 我怎样才能在C 中找出硬件的字节序 3 字节序是否影响二进制交互 例如 OR AND OR 或移位

随机推荐

  • windows下启动达梦数据库

    打开达梦服务查看器 将dmservice服务启动 再打开达梦服务管理工具进行连接
  • MySQL常见的面试经典108题

    目录 1 MySQL 索引使用有哪些注意事项呢 2 MySQL 遇到过死锁问题吗 你是如何解决的 3 日常工作中你是怎么优化SQL的 4 说说分库与分表的设计5 InnoDB与MyISAM的区别6 数据库索引的原理 为什么要用 B 树 为什
  • Binutils-2.23.2

    http lamp linux gov cn Linux LFS 6 2 chapter06 binutils html http davidgao github io LFSCN chapter06 binutils html Linux
  • Linux命令56问

    目录 2 查看CPU性能的指令 vmstat 3 查看内存使用情况的指令 free 4 查看硬盘使用情况的指令 df 5 查看网络IO情况的指令 ifstat 6 查看机器已建立的TCP连接的指令 Linux常用命令 8 cd命令的作用 9
  • 1-Kubernetes基础入门体系架构学习(一)

    0x00 基础简述 Borg 系统 Kubernetes 系统 1 发展经历 2 简要介绍 3 系统架构 0x01 组件详述 1 Kubernetes Master 2 Kubernetes Node 3 Kubernetes 插件 4 小
  • 【计算机网络】湖科大微课堂笔记 p64-66 TCP的运输连接管理:TCP的连接建立与释放、TCP报文段的首部格式

    文章目录 TCP的运输连接管理 TCP的连接建立 小结 一些例题 TCP的运输连接管理 TCP的连接释放 TCP报文段的首部格式 小结 TCP的运输连接管理 TCP的连接建立 TCP的连接建立要解决以下三个问题 TCP使用 三报文握手 建立
  • Flutter 沉浸式状态栏 安全区域 SafeArea以外的刘海屏 设置颜色

    白色 黑 import dart io import package flutter services dart void main runApp MyApp 白色 if Platform isAndroid 以下两行 设置android状
  • OSPF域内路由

    划分区域之后有什么好处呢 OSPF域内路由 属于同一个区域内的路由 OSPF划分区域的要求 基于链路 一个链路肯定是属于一个区域的 Router LSA 类LSA Network LSA 类LSA 区域内部都会有 类LSA和 类LSA 拓扑
  • 下载IDEA-2020.1

    文章目录 一 下载IDEA 2020 1 一 下载老师发的IDEA 2020 1安装包 二 在百度上搜索官网进行下载 1 网址 https www jetbrains com idea 2 单击 Download 二 安装IDEA 2020
  • 图片变成黑白

    实例
  • 小程序开发环境搭建

    工具下载 下载 访问https mp weixin qq com 进入 小程序界面 点击文档 进入小程序文件界面 如果要开发小程序可按照文档指示注册开发账号 在文档目录中找到安装开发工具 前往开发者工具下载界面即可下载开发工具 选择对应版本
  • nginx+upsync+consul实现动态的负载均衡

    1 什么是动态负载均衡 传统的负载均衡 如果Upstream参数发生变化 每次都需要重新加载nginx conf文件 因此扩展性不是很高 所以我们可以采用动态负载均衡 实现Upstream可配置化 动态化 无需人工重新加载nginx con
  • android软件静态分析系统的设计与实现,基于静态分析的安卓自动化测试优化设计与实现...

    摘要 随着移动互联网的飞速发展 智能手机软件迅速地融入了人们生活的各个方面 而作为智能手机市场中占额超过80 的Android操作系统 在设备数量和应用软件数量上都在快速地增长 为了保证Android应用软件功能的正确性和可靠性 需要对其进
  • sqlserver日期函数大全

    一般存入数据库中的时间格式为yyyy mm ddhh mm ss 如果要转换为yyyy mm dd 的日期格式 可以使用convert函数 下面是sqlserver帮助中关于convert函数的声明 CONVERT data type le
  • win10 远程桌面服务不见了解决办法

    由于员工操作错误 导致某杀毒软件把remote desktop services服务整个搞不见了 其他服务什么的都在 应该开的都开了 查了N多网上CTRL V后 发现注册表中termservice消失了 然后把其他版本相同的win10的te
  • 【微信篇】取证遇到微信昵称、微信号、微信账号、微信ID一次性区分清楚

    微信篇 取证遇到微信昵称 微信号 微信账号 微信ID一次性区分清楚 区别于 看得见 看不见 之间 suy 文章目录 微信篇 取证遇到微信昵称 微信号 微信账号 微信ID一次性区分清楚 一 微信账号 ID 永久唯一性 二 微信号 短期唯一性
  • 微信小程序-分享页面到微信群或者好友携带分享者身份信息

    原文链接 http www smallerpig com 1202 html utm source tuicool utm medium referral 当用户在群聊中点击小程序的分享卡片 开发者可获取群 ID 和群名称 更好地针对群场景
  • Kafka三款监控工具比较

    Kafka三款监控工具比较 转 在之前的博客中 介绍了Kafka Web Console这 个监控工具 在生产环境中使用 运行一段时间后 发现该工具会和Kafka生产者 消费者 ZooKeeper建立大量连接 从而导致网络阻塞 并且这个 B
  • Unreal Engine 4.20 Release Notes

    https docs unrealengine com en US Builds 4 20 Unreal Engine 4 20 Release Notes What s New Unreal Engine 4 20 delivers on
  • c++学习,引用-- 黑马笔记

    1 引用的基本使用 作用 给变量起别名 语法 数据类型 别名 原名 注意事项 引用必须初始化 引用初始化之后不可以改变 样例 include