C++初阶——基础知识(函数重载与引用)
目录
1.命名冲突
2.命名空间
3.缺省参数
4.函数重载
1.函数重载的特点包括:
2.函数重载的好处包括:
3.引用
引用的特点包括
引用的主要用途包括
引用和指针
引用
指针
类域
命名空间域
局部域
全局域
第一个关键字
命名冲突
同一个项目之间冲突
预作用限定符::
命名空间
缺省参数
1.命名冲突
指在同一个项目中出现了命名冲突的情况。为了避免命名冲突,可以使用预作用限定符(::)进行限定。
2.命名空间
是一种组织代码的机制,用于避免不同模块或库之间的命名冲突。命名空间可以将代码进行逻辑上的分组,并提供了一种层次化的命名结构。
3.缺省参数
指在函数或方法定义时给参数设置默认值,使得在调用时可以不传递该参数的值。这样做可以增加函数的灵活性和可重用性。
4.函数重载
函数重载是指在同一个作用域内定义多个相同名称但参数列表不同的函数。通过函数重载,可以根据传入的参数类型或数量的不同来调用不同的函数。
1.函数重载的特点包括:
- 函数名称相同:重载的函数必须使用相同的名称。
- 参数列表不同:重载的函数必须有不同的参数列表,可以是参数类型不同、参数数量不同或参数顺序不同。
- 返回值类型不影响重载:函数的返回值类型对函数重载没有影响,只有参数列表不同才能实现重载。
2.函数重载的好处包括:
- 提高代码的可读性:通过使用相同的函数名称,可以更直观地表示函数的功能和意图。
- 简化函数调用:不需要记住多个不同名称的函数,只需根据不同的参数类型或数量调用相同的函数名称。
- 增加代码的灵活性:可以根据不同的需求设计适用于不同情况的函数。
需要注意的是,在进行函数重载时,编译器会根据调用时的参数类型或数量匹配最合适的函数进行调用。如果存在多个函数都能匹配到调用条件,编译器会选择最精确匹配的函数进行调用。如果出现无法唯一确定调用的情况,编译器会报错。因此,在进行函数重载时,需要保证函数之间的参数列表能够明确区分。
下面是一个使用函数重载的示例代码
#include <iostream>
using namespace std;int add(int a, int b) {return a + b;
}double add(double a, double b) {return a + b;
}int add(int a, int b, int c) {return a + b + c;
}int main() {int x = 1, y = 2, z = 3;double u = 1.5, v = 2.5;cout << add(x, y) << endl; // 调用add(int, int)函数cout << add(u, v) << endl; // 调用add(double, double)函数cout << add(x, y, z) << endl; // 调用add(int, int, int)函数return 0;
}
在这个例子中,我们定义了三个同名但参数列表不同的add函数,分别接受两个整型参数、两个浮点型参数和三个整型参数。在main函数中,我们分别调用了这三个函数,并根据传入的参数类型来选择调用哪个函数。由于函数重载的存在,编译器可以根据传入的参数类型自动选择最适合的函数进行调用。
&取地址
3.引用
在编程中,引用是指通过使用已有变量的别名来访问该变量的值或者修改它。引用提供了一种方便的方式来操作变量,而无需直接访问内存地址。
引用的特点包括
- 别名:引用是变量的别名,它与原变量共享同一块内存空间。
- 内存共享:对引用的修改会直接影响到原变量的值,因为它们指向同一块内存地址。
- 无需解引用:使用引用时无需进行解引用(*)操作,可以像直接操作变量一样使用引用。
引用的主要用途包括
- 函数参数传递:通过引用传递参数,可以实现对变量的修改,而无需返回值。
- 避免拷贝开销:使用引用可以避免对大型对象进行拷贝,提高程序的效率。
- 别名操作:使用引用可以为变量创建别名,提高代码的可读性和可维护性。
需要注意的是,引用和指针不同。引用在定义时必须初始化,并且不能改变引用的目标,而指针可以在任意时刻指向不同的对象。引用也没有空值(null)的概念,而指针可以为空。
在C++中,使用&符号来声明引用,例如:
int a = 42;
int& ref = a; // ref是a的引用
在函数参数传递中,可以使用引用参数来实现对原变量的修改,例如:
void increment(int& num) {num++;
}int main() {int a = 5;increment(a); // 通过引用修改a的值cout << a; // 输出6return 0;
}
引用和指针
都是用于间接访问变量的工具,它们在C++中有着不同的特点和用法。
-
引用
- 引用是一个别名,它必须在创建时初始化,并且一旦指向了某个变量,就无法再指向其他变量。
- 引用本质上是对变量的另一个名字,使用起来更加直观,并且不需要进行解引用操作。
- 对引用的操作会直接影响到引用所指向的变量,因为它们共享同一块内存空间。
- 通常用于函数参数传递、返回引用值以及创建别名变量等场景。
-
指针
- 指针是一个变量,它存储了另一个变量的内存地址。指针可以在程序运行过程中被重新赋值,指向不同的变量或者空地址(nullptr)。
- 操作指针需要使用解引用操作符(*)来访问所指向的变量。
- 指针相对于引用更加灵活,可以动态分配内存,并支持指针算术运算。
- 在C++中,指针需要显式地进行内存管理,包括分配和释放内存,因此使用指针需要更加小心谨慎,以避免出现内存泄漏等问题。
在选择使用引用还是指针时,可以根据具体的需求和场景来决定:
- 如果需要在函数中修改变量的值,可以使用引用作为函数参数;
- 如果需要支持动态内存分配或者需要指向多个不同对象,可以使用指针。
下面是一个使用引用和指针的示例代码,以展示它们的不同特点:
#include <iostream>
using namespace std;void increment(int& num) {num++; // 直接操作num所指向的变量
}void allocate(int*& ptr, int size) {ptr = new int[size]; // 动态分配内存,并将ptr指向该内存块
}int main() {int a = 5;int* p = &a; // 使用指针来访问变量aint& r = a; // 使用引用来访问变量aincrement(a); // 通过引用修改a的值cout << a << endl; // 输出6int* q = nullptr;allocate(q, 10); // 动态分配内存,并将q指向该内存块q[0] = 42; // 使用指针操作动态分配的内存delete[] q; // 释放动态分配的内存return 0;
}
在这个例子中,我们定义了一个increment函数,它使用引用参数来修改传入的变量的值。我们还定义了一个allocate函数,它使用指针参数来动态分配内存,并将指针指向该内存块。在main函数中,我们使用引用r和指针p来访问变量a,然后调用increment函数来修改a的值。我们还使用指针q来动态分配内存,并使用q来访问和操作动态分配的内存。最后,我们释放了动态分配的内存。
相关文章:

C++初阶——基础知识(函数重载与引用)
目录 1.命名冲突 2.命名空间 3.缺省参数 4.函数重载 1.函数重载的特点包括: 2.函数重载的好处包括: 3.引用 引用的特点包括 引用的主要用途包括 引用和指针 引用 指针 类域 命名空间域 局部域 全局域 第一个关键字 命名冲突 同一个项目之间冲…...

车载电子电器架构 —— 电子电气系统开发角色定义
车载电子电器架构 —— 电子电气系统开发角色定义 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 注:本文12000字,深度思考者进!!! 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的…...

最新Redis7哨兵模式(保姆级教学)
一定一定要把云服务器的防火墙打开一定要!!!!!!!!!否则不成功!!!!!!!!&…...

Redis原理及常见问题
高性能之道 单线程模型基于内存操作epoll多路复用模型高效的数据存储结构redis的单线程指的是数据处理使用的单线程,实际上它主要包含 IO线程:处理网络消息收发主线程:处理数据读写操作,包括事务、Lua脚本等持久化线程:执行RDB或AOF时,使用持久化线程处理,避免主线程的阻…...

nvm 的安装及使用 (Node版本管理器)
目录 1、nvm 介绍 2、nvm安装 3、nvm 使用 4、node官网可以查看node和npm对应版本 5、nvm安装指定版本node 6、安装cli脚手架 1、nvm 介绍 NVM 全称 node.js version management ,专门针对 node 版本进行管理的工具,通过它可以安装和切换不同版本的…...
【Yii2】数据库查询方法总结
目录 1.查找单个记录: 2.查找多个记录: 3.条件查询: 4.关联查询: 假设User模型有一个名为orders的多对一关联关系。 5.排序和分组: 6.数据操作: 7.事务处理: 8.命令查询: 9…...

区块链的三难困境是什么,如何解决?
人们需要保持社交、工作和睡眠之间的平衡,并且努力和谐相处。同样的概念也反映在区块链的三难困境中。 区块链三难困境是一个术语,指的是现有区块链的局限性:可扩展性、安全性和去中心化。这是一个存在了几十年的设计问题,其问题的…...

oCPC实践录 | oCPM的秘密
前言 笔者从这几方面介绍oCPM,并一一分析平台侧宣称的oCPM相比oCPC的优势,并解开其中的秘密。 1)什么是oCPM? 2)oCPC与oCPM的异同 3)平台宣称oCPM的优势 4)oCPM真正的秘密 5)oCPM下的点击率与…...

【Linux Shell学习笔记】Linux Shell的位置参数与函数
一、位置参数 位置参数,也被称之为位置变量,通过位置参数,可以在执行程序的时候,向程序传递数据 1.1 shell接收参数的方法 1.2 向shell传递参数的方法 二、函数 2.1 函数基础 2.1.1 函数简介 函数本质上就是一个代码块…...

缓存cache和缓冲buffer的区别
近期被这两个词汇困扰了,感觉有本质的区别,搜了一些资料,整理如下 计算机内部的几个部分图如下 缓存(cache) https://baike.baidu.com/item/%E7%BC%93%E5%AD%98 提到缓存(cache),就…...

Vue常见面试问答
vue响应式数据 vue2 Vue2 的对象数据是通过 Object.defineProperty 对每个属性进行监听,当对属性进行读取的时候,就会触发 getter,对属性进行设置的时候,就会触发 setter。 /** * 这里的函数 defineReactive 用来对 Object.def…...
Eureka相关面试题及答案
1、什么是Eureka? Eureka是一个由Netflix开发的服务发现(Service Discovery)工具,它是Spring Cloud生态系统中的一个关键组件。服务发现是微服务架构中的一个重要概念,它允许服务实例在启动时注册自己,以便…...

想要学会JVM调优,先掌握JVM内存模型和JVM运行原理
1、前言 今天将和你一起探讨Java虚拟机(JVM)的性能调优。 JVM算是面试中的高频问题了,通常情况下总会有人问到:请你讲解下 JVM 的内存模型,JVM 的 性能调优做过? 2、为什么 JVM 在 Java 中如此重要 首…...
详解C语言入门程序:HelloWorld.c
#include <stdio.h> // 头文件,使用<>编译系统会在系统头文件目录搜索在C语言中,#include 是预处理指令,用于将指定的头文件内容插入到当前源文件中。这里的 <stdio.h> 是一个标准库头文件,其中包含了与输入输出…...

【elk-day01】es和kibana搭建及验证---Mac-Docker
Mac系统使用Docker下载搭建和验证eskibana Docker下载安装es安装es验证kibana安装kibana验证 Docker下载安装 Docker Desktop官网安装下载地址 说明一下为什么要安装desktop版本的docker,因为docker作为工具使用,我们需要的是开箱即用,没有必…...

探索 3D 图形处理的奥秘
最近一年多来,在 3Dfx、Intel 们的狂轰滥炸中,在 Quake、古墓丽影们的推波助澜下,三维图形已经成为计算机迷眼中的又一个热点。3D 世界到底是怎样的神奇,我们又是怎样享受它的乐趣呢?就让我们来一探究竟吧。 图形基础…...
R语言孟德尔随机化研究工具包(1)---friendly2MR
friendly2MR是孟德尔岁随机化研究中的一个重要补充工具,可以批量探索因素间的因果关系,以及快速填补缺失eaf的数据,但是存在细微差异需要注意。 remotes::install_github("xiechengyong123/friendly2MR") library(friendly2MR)lib…...
CentOS7下使用Docker安装Nacos
CentOS7下使用Docker安装Nacos 一、查看和nacos相关的镜像二、拉去镜像三、创建容器四、查看日志 一、查看和nacos相关的镜像 docker search nacos二、拉去镜像 拉取 nacos/nacos-server:1.2.0 镜像 docker pull nacos/nacos-server:1.2.0三、创建容器 docker run --env MO…...

用 Node.js 写一个爬虫
自己设计一个网站,然后去爬取别人家页面的数据来做一个自己的网站。哈哈哈,如果自己写着玩可能没啥事,但如果用这个网站来获利,你可能就要被寄律师函了,毕竟这有点‘刑’。这篇文章呢,就带大家爬取豆瓣TOP2…...

关于HTTPS
目录 什么是加密 对称加密 非对称加密 中间人攻击 引入证书 HTTPS是一个应用层的协议,是在HTTP协议的基础上引入了一个加密层. HTTP协议内容都是按照文本的方式明文传输,这就导致在传输的过程中出现一些被篡改的情况. 运营商劫持事件 未被劫持的效果,点击下载按钮,就会…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...