C++初阶 -1- C++入门part2

news2024/11/17 23:52:57

文章目录

  • 6.引用
    • 什么是引用?
    • 引用的使用
    • 引用的应用
      • 传值、传引用效率比较
      • 权限
      • 引用和指针的区别⭐
  • 7.内联函数
  • 8.auto关键字
  • 9.基于范围的for循环
  • 10.指针空值——nullptr

6.引用

什么是引用?

  • “别名”
int a = 0;
int& b = 0;

在这里插入图片描述
👆即 地址为0x000000BC0C6FFB94的空间即可以称为“a”,也可以成为“b”

引用:类型& 引用变量名(对象名) = 引用实体;
引用变量名 必须有且只有一个引用实体

  1. 可以取多个“别名”
  2. 可以给 “别名” “取别名”
  3. 可以给 任何类型 “取别名”
int a = 0;
int& b = a;
int& c = b;

int* p = &a;
int*& pb = p;

在这里插入图片描述

引用的使用

  • 引用必须初始化在这里插入图片描述
  • 常引用
void TestConstRef()
{
    const int a = 10;
    //int& ra = a;   // 该语句编译时会出错,a为常量
    //正确的:
    const int& ra = a;
    
    // int& b = 10; // 该语句编译时会出错,b为常量(非常量引用的初始值必须为左值),10为常量,int为整型变量
    //正确的:
    const int& b = 10;
    
    double d = 12.34;
    //int& rd = d; // 该语句编译时会出错,类型不同
    //正确的:
    const int& rd = d;
}

引用的应用

1.做函数参数:输出型函数,形参的改变需要影响实参

void Swap(int& x, int& y)
{
	int tmp = x;
	x = y;
	y = tmp;
}

int main()
{
	int x = 13, y = 7;
	Swap(x, y);

	cout << x << " " << y << endl;

	return 0;
}

2.做返回值:引用返回
在这里插入图片描述
如上图,引用返回的作用:①减少拷贝;②调用者可以修改返回对象
变量 add 的空间在函数结束后被归还给操作系统,则 add 空间储存的内容将不得而知。

  • sum.出了函数生命还在的变量可以用引用返回
//C语言:传值返回
int func(const int x, const int y)
{
	int n = x + y;
	return n;
}

//C++:引用返回
int& func()
{
	static int n = 0;
	n++;
	// ...
	return n;
}

int& Add(int x, int y)
{
	int add = x + y;
	return add;
}

int main()
{
	cout << "Add=" << Add(x, y) << endl;

	Count();
	Count();
	Count();
	Count();
	Count();
	cout << "Count=" << Count() << endl;
	return 0;
}

输出:
Add=-858993460 随机值
Count=6

传值、传引用效率比较

以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。

权限

⭐指针、引用和赋值,权限可以缩小,但是不能放大

  • 权限放大:
const int c = 2;//对c空间只有“只读”的权限
	int& d = c;
  • 权限缩小:
int x = 1;//可读可写
const int& y = x;//可读
  • 权限保持:
const int* p1 = nullptr;
const int* p2 = p1;

📍类型转换会产生临时变量
在这里插入图片描述

引用和指针的区别⭐

语法上有区别,但底层实现本质上是相同的。

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
  2. 引用在定义时必须初始化,指针没有要求
  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何
    一个同类型实体
  4. 没有NULL引用,但有NULL指针
  5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32
    位平台下占4个字节)
  6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  7. 有多级指针,但是没有多级引用
  8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  9. 引用比指针使用起来相对更安全

7.内联函数

inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。

  • C++ 推荐:
    1. constenum 代替宏常量
    2. inline 代替宏函数 → 适合“小”函数

inline 内联函数的特性:

  1. inline是一种以空间换时间的做法
  2. inline对于编译器而言只是一个建议,可能展开也可能不展开
  3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址
    了,链接就会找不到。(内联函数不进符号表

在这里插入图片描述


8.auto关键字

auto 自动识别类型

int a = 0;
auto b = a;
auto c = &a;

在这里插入图片描述

  • auto 不能

    1. 一行命名多个
      在这里插入图片描述

    2. 不能声明数组
      在这里插入图片描述

  • aoto 的应用:
    简化代码

  • typedef 的缺陷

typedef char* ptr;

const ptr p1;(编译错误 typedef后实际上是: char* const p1;常量指针必须初始化;没有为什么,语法归档
const ptr* p2;//编译正常

9.基于范围的for循环

范围for——语法糖:对于一个有范围的集合,自动依次取其中的数据赋值给对象var(var只是这个取得一个变量名),自动判断结束

int main()
{
	int array[] = { 1, 2, 3, 4, 5 };
	for (auto& var : array)
		var *= 2;

	for (auto num : array)
		cout << num << " ";
	输出结果:2 4 6 8 10
	//这里的var和num都是变量名,两者一不一样或取什么名字都是不影响的

	return 0;
}
  • 使用条件:
    1. for循环迭代的范围必须是确定
    2. 迭代的对象要 实现++和== 的操作。

10.指针空值——nullptr

简而言之,NULL在C++中出现了bug,所以引入 nullptr

nullptr 使用注意:

  1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入 的。
  2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
  3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。

END

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

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

相关文章

【linux】:模拟文件基本操作以及文件在磁盘中如何存储的学习

文章目录 前言一、模拟C库文件操作二、磁盘文件总结前言 经过我们上一篇对linux系统文件操作的学习想必我们已经会使用系统文件接口了&#xff0c;今天我们就用系统文件接口来封装一个像C语言库那样的文件操作函数的函数来加深我们对文件操作的学习。 一、模拟C库文件操作 首…

通过Milo实现的OPC UA客户端连接并订阅Prosys OPC UA Simulation Server模拟服务器

背景 前面我们搭建了一个本地的 PLC 仿真环境&#xff0c;并通过 KEPServerEX6 读取 PLC 上的数据&#xff0c;最后还使用 UAExpert 作为 OPC 客户端完成从 KEPServerEX6 这个OPC服务器的数据读取与订阅功能&#xff1a;SpringBoot集成Milo库实现OPC UA客户端&#xff1a;连接…

新一代信息技术赋能,安科瑞搭建智慧水务体系的新思路

随着新时期治水方针的逐步落实&#xff0c;水利现代化、智能化建设已开启&#xff0c;物联网、图像识别、数字孪生等新技术的成熟&#xff0c;也为智慧水务体系的搭建提供了技术保障&#xff0c;新时代治水新思路正逐步得到落实。本文对智慧水务的总体架构与包含的建设内容进行…

Qt第六十二章:图标库QtAwesome的使用

目录 一、安装依赖 二、主页 三、文档 四、案例 1、图标 2、样式 3、alpha 通道 4、 多图标堆叠 5、动画 6、字体 五、系列 1、msc系列 2、fa5系列&#xff08;选择free栏&#xff09; 3、fa5s系列&#xff08;选择free栏&#xff09; 4、fa5b系列&#xff08;选…

由libunifex来看Executor的任务构建

前言 之前的一篇文章讲述了future的优缺点&#xff0c;以及future的组合性&#xff0c;其中也讲述了构建任务DAG一些问题&#xff0c;同时给出了比较好的方案则是Executor。 Executor还未进入标准&#xff08;C23&#xff09;&#xff0c;Executor拥有惰性构建及良好的抽象模型…

尚硅谷大数据技术Zookeeper教程-笔记03【源码解析-算法基础】

视频地址&#xff1a;【尚硅谷】大数据技术之Zookeeper 3.5.7版本教程_哔哩哔哩_bilibili 尚硅谷大数据技术Zookeeper教程-笔记01【Zookeeper(入门、本地安装、集群操作)】尚硅谷大数据技术Zookeeper教程-笔记02【服务器动态上下线监听案例、ZooKeeper分布式锁案例、企业面试真…

多模态大模型的发展、挑战与应用

多模态大模型的发展、挑战与应用 2023/04/15 研究进展 随着 AlexNet [1] 的出现&#xff0c;过去十年里深度学习得到了快速的发展&#xff0c;而卷积神经网络也从 AlexNet 逐步发展到了 VGG [2]、ResNet [3]、DenseNet [4]、HRNet [5] 等更深的网络结构。研究者们发现&#…

用vscode运行Java程序初体验

最近开始学习Java编程了&#xff0c;以前学习过C、C 、Python&#xff0c;主要用微软的visual studio code来运行python程序&#xff0c;于是就尝试了用vscode来运行java代码&#xff0c;记录一下使用的经验&#xff0c;帮助大家少走弯路。 安装了Java的集成编辑器IDE "Ec…

c++STL之关联式容器

目录 set容器 set的默认构造 set的插入与迭代器 set集合的元素排序 set集合的初始化及遍历 从小到大(默认情况下) 从大到小 仿函数 set的查找 pair的使用 multiset容器 map和multimap容器 map的插入与迭代器 map的大小 map的删除 map的查找 关联式容器&#…

【LeetCode: 337. 打家劫舍 III | 暴力递归=>记忆化搜索=>动态规划 | 树形dp】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

整数二分从入门到精通

前言&#xff1a; 开个玩笑&#xff0c;我们写算法可不能这样哈~ 好了&#xff0c;正片开始&#xff1a; 你是否曾经也有过整数二分因为一直死循环而苦恼&#xff0c;你是否因为搞不清楚整数二分的边界处理而焦躁&#xff0c;明明很简单的一道二分&#xff0c;但是最后就是搞…

Python入门教程+项目实战-9.1节: 字符串的定义与编码

目录 9.1.1 理解字符串 9.1.2 字符串的类型名 9.1.3 字符的数字编码 9.1.4 常用的字符编码 9.1.5 字符串的默认编码 9.1.6 字符串的编码与解码 9.1.7 转义字符详解 9.1.8 对字符串进行遍历 9.1.9 知识要点 9.1.10 系统学习python 9.1.1 理解字符串 理解字符串&#…

005:Mapbox GL添加全屏显示功能

第005个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中添加全屏显示功能 。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共60行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:https://…

还在因为写项目函数太多而烦恼?C++模板一文带你解决难题

&#x1f4d6;作者介绍&#xff1a;22级树莓人&#xff08;计算机专业&#xff09;&#xff0c;热爱编程&#xff1c;目前在c&#xff0b;&#xff0b;阶段>——目标Windows&#xff0c;MySQL&#xff0c;Qt&#xff0c;数据结构与算法&#xff0c;Linux&#xff0c;多线程&…

轮廓查找与绘制

轮廓查找与绘制 1)什么是轮廓 轮廓可以简单认为成将连续的点&#xff08;连着边界&#xff09;连在一起的曲线&#xff0c;具有相同的颜色或者灰度&#xff0c;提取轮廓就是提取 这些具有相同颜色或者灰度的曲线&#xff0c;或者说是连通域&#xff0c;轮廓在形状分析和物体…

学习系统编程No.20【进程间通信之命名管道】

引言&#xff1a; 北京时间&#xff1a;2023/4/15/10:34&#xff0c;今天起床时间9:25&#xff0c;睡了快8小时&#xff0c;昨天刷视屏刷了一个小时&#xff0c;本来12点的时候发完博客洗把脸就要睡了&#xff0c;可惜&#xff0c;看到了一个标题&#xff0c;说实话&#xff0…

.Net路由操作!!!!

什么是路由 问题 答案 路由是什么&#xff1f; 路由系统负责处理传入的请求并选择控制器和操作方法来处理它们。 路由系统还用于在视图中生成路由&#xff0c;称为传出的URL 路由有什么用&#xff1f; 路由系统能够灵活地处理请求&#xff0c;面不是将URL与Visual Studio…

MySQL(31)-ubuntu20.04-下安装mysql5.7

ubuntu20.04 下apt 默认安装的是8.0版本&#xff0c;如果要安装5.7版有如下3种方式&#xff1a; 1 下载 MySQL 二进制压缩包&#xff0c;解压并设置相关的参数即可运行 2 通过命令 apt install 进行安装&#xff0c;先下载 MySQL 5.7 对应的源&#xff0c;然后执行安装命令 ap…

5 分钟带你小程序入门 [实战总结分享]

微信小程序常常用 4 种文件类型 JS 文件 JS 在小程序中用于编写页面逻辑和交互效果&#xff0c;可调用 API 接口完成数据请求和处理&#xff0c;也可以使用第三方库和框架。 模块化编程&#xff1a;小程序中JS文件可以使用ES6的模块化语法&#xff0c;通过export和import来…

【vue3】关于watch与computed的用法看这个就ok

&#x1f609;博主&#xff1a;初映CY的前说(前端领域) ,&#x1f4d2;本文核心&#xff1a;watch()与computed的使用【vue2中watch|computed概念详解】&#xff0c;本文将介绍在vue3中怎么使用这两者技能 【前言】vue2当中有这两个技能&#xff0c;那么vue3中的watch与compute…