【C++】命名空间、缺省参数、函数重载、引用

news2024/11/28 7:40:55

文章目录

  • 1.认识命名空间
  • 2.命名空间的使用
  • 3.C++的输入和输出
  • 4.缺省参数
    • 4.1缺省参数的概念
    • 4.2缺省参数的分类
  • 5.函数重载
  • 6.引用
    • 6.1引用的概念
    • 6.2引用的特性
    • 6.3常引用(重点题目)
    • 6.4引用和指针的区别

1.认识命名空间

C++总计63个关键字,C语言32个关键字在这里插入图片描述

下面让我们学习一下第一个关键字namespace

首先,我们来看下面的代码
在这里插入图片描述
我们定义了一个名为 rand 的全局变量,此时可以正确的打印出来。

当我们引用了<stdlib.h>这个头文件时,我们发现此时代码就会报错,如下图。
在这里插入图片描述
在这里插入图片描述
我们都知道,rand是一个产生随机数的函数名,此时该名称与我们定义的全局变量命名发生了冲突,编译器就不知道选哪个了。
然而,C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决

使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字然后接一对{}即可,{}中即为命名空间的成员。

命名空间有几种使用方式:

  1. 正常的命名空间定义
//aim 是命名空间的名字,实际中一般以项目名称命名
namespace aim1
{
	int rand = 10;
}
  1. 嵌套定义
namespace aim1 //命名空间1
{
	int rand = 10;

	namespace aim2//命名空间2
	{
		int rand = 20;
	}
}
  1. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中

两个文件中的同名命名空间最后会进行合并,因此会出现重定义问题。
在这里插入图片描述

注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中

2.命名空间的使用

使用命名空间解决访问冲突的问题后,我们发现仍然访问不到它,此时rand使用的依然是rand函数,打印出来函数的地址。
在这里插入图片描述

下面就来介绍一下命名空间是如何访问的,有3种方式:

  1. 命名空间名称作用域限定符

作用域限制符就是两个冒号,此时我们就可以访问到定义的变量了
在这里插入图片描述

  1. 使用using将命名空间中某个成员引入

using是我们学习的第二个关键字
在这里插入图片描述

我们发现,只有被引入的成员才可以被访问,其它成员依旧不可以。若想访问其它成员,也需要将其引入

  1. 使用using namespace 命名空间名称引入

在这里插入图片描述
此时我们发现,a变量可以访问了,然而rand又出现了问题。什么原因呢?

我们知道,编译器的默认查找是:
a. 当前局部域
b. 全局域
b. 到展开的命名空间中查找

此时我们的全局域中和命名空间中都有rand,显然不知道选哪一个,此时我们就需要指定了。因此使用第三种方式时要慎重,不然就是自找麻烦
/
此时我们就可以发现,若某一成员需要经常使用,可以将其引入;对于不常使用的成员,可以使用命名空间加作用域限定符
在这里插入图片描述
很显然,引入了成员后使用更加方便。

自己在学习中遇到的问题:为什么使用命名空间中的宏时不需要指定?
在这里插入图片描述
宏定义是在编译时预处理阶段完成的,而命名空间是在编译时进行名称空间分配和解析的在预处理阶段,编译器并不知道命名空间的存在,所以它无法对命名空间进行解析,因此也就无法指定命名空间。
当使用命名空间内的宏时,编译器会在预处理阶段将宏展开成相应的代码,而展开后的代码中不包含命名空间,因此不需要指定命名空间

3.C++的输入和输出

  • 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std

在这里插入图片描述

  • cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。
  • <<流插入运算符,>>流提取运算符。
  • 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型
    浮点数输出时,也不会像scanf 那样默认小数点后6位;它是原样输出。

在这里插入图片描述

  • 输入时,也不需要取地址了

在这里插入图片描述

std命名空间的使用惯例:
std是C++标准库的命名空间,如何展开std使用更合理呢?

  1. 日常练习中,建议直接using namespace std即可,这样就很方便
  2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以在项目开发中建议使用像 std::cout这样使用时指定命名空间 或 using std::cout展开常用的库对象/类型等方式

4.缺省参数

4.1缺省参数的概念

缺省参数是声明定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
在这里插入图片描述

4.2缺省参数的分类

  1. 全缺省参数

在这里插入图片描述
2. 半缺省参数

在这里插入图片描述

注意:

  • 半缺省参数必须从右往左依次来给出,不能间隔着给。

在这里插入图片描述

  • 缺省参数不能在函数声明和定义中同时出现

如果声明与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值
在这里插入图片描述

在这里插入图片描述

  • 缺省值必须是常量或者全局变量

5.函数重载

C语言是不支持同名函数存在的,C++支持。

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数这些同名函数的形参列表(参数的个数类型类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

  1. 参数类型不同

在这里插入图片描述

  1. 参数类型的顺序不同

在这里插入图片描述

  1. 参数的个数不同

在这里插入图片描述

注意:

  • 同一作用域中,同名函数要想同时存在,必须满足重载的规则。
  • 不同作用域,可以有同名函数
  • 返回值是不构成重载的(返回值不像参数,编译器对它是无法区分的,它也不是必须的)
  • 重载的规则是针对于参数的类型和个数,与参数的名称无关、参数缺省无关

为什么C++支持重载,C语言不支持?

  • 因为在程序进行链接的时候,是使用函数名去找地址的,如果声明和定义分离,C语言是直接使用函数名去找,区分不开。
  • C++使用函数名修饰规则,可以区分。

6.引用

6.1引用的概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间,它们的地址是一样的

定义方式:类型& 引用变量名(对象名) = 引用实体;

在这里插入图片描述

注意:引用类型必须和引用实体是同种类型的

在这里插入图片描述
引用就是祖师爷本贾尼觉得C语言指针不好才搞得,下面的代码就比指针方便的多。

在这里插入图片描述

6.2引用的特性

  1. 引用在定义时必须初始化
  2. 一个变量可以有多个引用
  3. 引用一旦引用一个实体,再不能引用其他实体
  1. 引用在定义时必须初始化

在这里插入图片描述

  1. 一个变量可以有多个引用
int main()
{

	int x = 10;
	//一个变量多个引用
	int& a = x;
	int& b = x;
	int& c = x;
	int& d = x;

	return 0;
}
  1. 引用一旦引用一个实体,再不能引用其他实体

下面的代码中是将a变成y的别名?还是将y赋值给a呢?
在这里插入图片描述
很显然,它是将y赋值给了a

6.3常引用(重点题目)

void TestConstRef()
{
	const int a = 10;
	//int& ra = a;   // 该语句编译时会出错,a为常量
	const int& ra = a;

	// int& b = 10;  // 该语句编译时会出错,b为常量
	const int& b = 10;

	double d = 12.34;
	//int& rd = d;  // 该语句编译时会出错,类型不同,d为常量
	const int& rd = d;
}
  1. 权限的平移
int main()
{
	const int m = 0;

	//权限的放大
	//int& n = m; //error  m的权限是可读,n的权限是可读可写的

	//权限的平移
	const int& n = m;//可以
	
	//可以,不是权限的放大
	//只是将m的值拷贝给x,x的修改不影响p
	int x = m;

	return 0;
}
  1. 权限的缩小

在这里插入图片描述

  1. 权限的放大(错误、易错
int main()
{
	const int m = 0;
	//cosnt修饰指针,左定值,右定向
	//p1可以修改,*p1不可以,const修饰的是*p1
	const int* p1 = &m;
	p1++;

	//权限的放大,不可以
	//int* p2 = p1;  //易错

	//权限平移,可以
	const int* p2 = p1;
	return 0;
}

总结:值之间没有权限的放大和缩小的概念,只是一个拷贝;指针与引用有权限放大与缩小的概念,权限只可以缩小,不可以放大

6.4引用和指针的区别

在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。
在这里插入图片描述

在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。

int main()
{
	int x = 0;
	int& y = x;
	y = 10;
	
	int n = 10;
	int* p = &n;
	*p = 20;
	return 0;
}

我们来看引用和指针的反汇编对比
在这里插入图片描述

引用和指针的不同

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

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

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

相关文章

Ubuntu虚拟机上推荐一款免费好用的git版本管理工具

工具叫: gitg 软件界面如下&#xff1a; FR:徐海涛(hunkxu)

上海计算机学会2022年5月月赛C++丙组T3打印金字塔

题目描述 给定一个整数 n&#xff0c;请打印一个具有 n 层结构的三角形金字塔&#xff0c;例如当 n3 时&#xff0c;打印如下图形&#xff1a; /\ /__\/\ /\/__\/__\/\ /\ /\ /__\/__\/__\输入格式 单个整数&#xff1a;表示 n。 输出格式 根据题意输出层次为 n 的三角形…

祝贺嫦娥六号发射成功,思迈特再为航天项目提供数据支持和保障

近日&#xff0c;嫦娥六号由长征五号遥八运载火箭在中国文昌航天发射场发射成功。 据悉&#xff0c;嫦娥六号是中国探月工程的第六个探测器&#xff0c;其主要任务是前往月球背面的南极-艾特肯盆地进行科学探测和样品采集。 嫦娥六号任务不仅是技术上的挑战&#xff0c;也是科学…

图片转表格的免费软件,这几款值得收藏!

在数字化时代&#xff0c;图片转表格的需求日益增多。无论是工作汇报、数据分析还是学术研究&#xff0c;将图片中的信息转化为表格都能极大地提高工作效率。然而&#xff0c;许多人在面对这一任务时&#xff0c;往往感到无从下手。今天&#xff0c;我将为大家推荐几款免费的图…

【软件的安装与基本设置】AD21软件的基本设置

软件安装好以后&#xff0c;需要对软件进行一些基本设置&#xff0c;以方便原理图绘制和pcb设计时的操作&#xff0c;提高效率。 点击右上角的设置按钮 打开后包含以下设置&#xff0c;但是不是所有都需要设置&#xff0c;只是将需要用到的功能设置即可。 对于系统参数设置 第…

Kubernetes的Pod控制器深度解析

1.1 Pod控制器介绍 在Kubernetes中&#xff0c;Pod是最小的管理单元&#xff0c;用于运行容器。根据Pod的创建方式&#xff0c;可以将其分为两类&#xff1a; 自主式Pod&#xff08;Stateless Pods&#xff09;&#xff1a;这些Pod是直接由用户或管理员创建的&#xff0c;通常…

【JAVA入门】Day04 - 方法

【JAVA入门】Day04 - 方法 文章目录 【JAVA入门】Day04 - 方法一、方法的格式1.1 无参无返回值的方法定义和调用1.2 带参数的方法定义和调用1.3 形参和实参1.4 带返回值的方法定义和调用1.5 方法的注意事项 二、方法的重载三、方法的使用四、方法的内存原理4.1 方法调用的基本内…

深度学习技术之加宽前馈全连接神经网络

深度学习技术 加宽前馈全连接神经网络1. Functional API 搭建神经网络模型1.1 利用Functional API编写宽深神经网络模型进行手写数字识别1.1.1 导入需要的库1.1.2 加载虹膜&#xff08;Iris&#xff09;数据集1.1.3 分割训练集和测试集1.1.4 定义模型输入层1.1.5 添加隐藏层1.1…

值得关注的10种新兴网络安全威胁

随着人类社会的技术、商业和工业活动不断发展&#xff0c;网络犯罪分子也总在寻找更先进的攻击技术和模式。不久前&#xff0c;欧盟网络安全机构&#xff08;ENISA&#xff09;编写发布了《2030年网络安全威胁展望报告》&#xff0c;对未来可能影响数字领域的10种新兴网络安全威…

变频器通过Modbus转Profinet网关接电机与PLC通讯在自动化的应用

Modbus转Profinet网关&#xff08;XD-MDPN100/300/600&#xff09;的作用是将Modbus协议转换为Profinet协议&#xff0c;支持Modbus RTU主站/从站&#xff0c;并且Modbus转Profinet网关设备自带网口和串口&#xff0c;既可以实现协议转换的同时&#xff0c;也可以实现接口的转换…

Diffusion Inversion技术

Diffusion Inversion技术 在图像生成/编辑领域中&#xff0c;Inversion 技术是指将一张&#xff08;真实&#xff09;图片转换为生成模型对应的 latent&#xff0c;要求将这个 latent 输入到生成模型中之后&#xff0c;能够重构出原始图片。这项技术是进行图像编辑的重要基础。…

【触想智能】无风扇工控一体机的优点与定制要求分析

随着工业自动化的不断推进&#xff0c;工控一体机作为自动化生产的核心设备&#xff0c;在工业生产中发挥着越来越重要的作用。 在工控一体机的设计中&#xff0c;散热是一个非常关键的问题&#xff0c;而无风扇工控一体机的出现为解决这个问题提供了新方法。 无风扇工控一体机…

栈结构(详解)

1.栈的概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&am…

【SAP ABAP学习资料】通过RFC接口上传图片至SAP 图片格式转换 图片大小调整

SAP图片相关&#xff1a; 链接: 【SAP ABAP学习资料】图片上传SAP 链接: 【SAP ABAP学习资料】屏幕图片预览 链接: 【SAP ABAP学习资料】smartforms打印图片&#xff0c;动态打印图片 需求&#xff1a; SAP上传图片只能本地电脑选择图片通过SE78或PERFORM IMPORT_BITMAP_BDS上…

免费的集成组件有哪些?

集成组件是指将多个软件或系统进行整合&#xff0c;以实现更高效、更可靠的数据处理和管理。在数据管理和分析领域&#xff0c;集成组件是不可或缺的工具之一。 在当今高度信息化的时代&#xff0c;集成组件在各行各业的应用中扮演着举足轻重的角色。集成组件能够将不同来源的…

品牌舆情都包含什么内容?建议收藏

一个品牌的声誉、形象、产品质量、服务质量等&#xff0c;无时无刻不在接受着大众的检验。互联网传播迅速&#xff0c;一个不好的舆论直接导致整个品牌的声誉受到严重影响。品牌舆情都包含什么内容&#xff1f;接下来伯乐网络传媒就来给大家讲一讲。 一、品牌舆情的基本构成 1…

局域网语音对讲系统_IP广播对讲系统停车场解决方案

局域网语音对讲系统_IP广播对讲系统停车场解决方案 需求分析&#xff1a; 随着国民经济和社会的发展&#xff0c; 选择坐车出行的民众越来越多。在保护交通安全的同时&#xff0c;也给停车场服务部门提出了更高的要求。人们对停车场系统提出了更高的要求与挑战&#xff0c; 需要…

从XML配置角度理解Spring AOP

1. Spring AOP与动态代理 1.1 Spring AOP和动态代理的关系 Spring AOP使用动态代理作为其主要机制来实现面向切面的编程。这种机制允许Spring在运行时动态地创建代理对象&#xff0c;这些代理对象包装了目标对象&#xff08;即业务组件&#xff09;&#xff0c;以便在调用目标对…

C++11智能指针之一(简介)

1 概述 从C11开始C语言越来向现代化语言转变。尤其是智能指针的引入&#xff0c;代码中不会直接使用new/delete了。C11智能指针有三种分别是&#xff1a;shared_ptr&#xff0c;weak_ptr 和unique_ptr 。 2 类图 3 共享指针(shared_ptr) 接口函数&#xff1a; shared_ptr 构…

华企盾DSC数据防泄密软件有哪些水印功能?

在企业数据安全领域&#xff0c;水印技术是一种重要的信息保护策略&#xff0c;用于防止数据泄露和确保信息的原始性和完整性。根据回顾的资料&#xff0c;以下是企业中常用的几种水印技术&#xff1a; 屏幕浮水印&#xff1a;这种水印能够在用户的屏幕上显示公司的标志或者其他…