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

文章目录

  • 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. 引用比指针使用起来相对更安全

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

难以重现的 Bug如何处理

对很多测试人员&#xff08;尤其是对新手来说&#xff09;在工作过程中最不愿遇到的一件事情就是&#xff1a;在测试过 程中发现了一个问题&#xff0c;觉得是 bug&#xff0c;再试的时候又正常了。 碰到这样的事情&#xff0c;职业素养和测试人员长期养成的死磕的习性会让她…

常用的内外网文件传输方式及优缺点

在现代企业环境中&#xff0c;内外网文件传输是一项至关重要的任务。这涉及到数据的安全性、传输效率以及操作的便捷性等多个方面。 每种方式都有其独特的优缺点&#xff0c;下面我们将逐一进行分析。 1、FileLink 优势&#xff1a;FileLink是一款专用于企业内外网隔离后的文…

Spring Boot | Spring Boot 整合 “异步任务“ 的实现

目录&#xff1a; 一、异步任务1.1 "无返回值" 异步任务调用 :① 创建项目② 编写 "异步调用方法" ( 使用 Async 注解 )③ "主程序启动类"中 开启基于 "注解" 的异步任务支持 ( 使用EnableAsync注解 )④ 编写 "控制层" 相关…

Linux本地部署Nightingale夜莺监控并实现远程访问提高运维效率

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

轴承制造企业“数智化”突破口

轴承是当代机械设备中一种重要零部件。它的主要功能是支撑机械旋转体&#xff0c;降低其运动过程中的摩擦系数&#xff0c;并保证其回转精度。轴承是工业核心基础零部件&#xff0c;对国民经济发展和国防建设起着重要的支撑作用。 轴承企业普遍采用以销定产的经营模式&#xf…

Android Studio开发之路(九)创建android library以及生成aar文件

一、需求 我做了一个camerax相机opencv图像处理图片上传服务器功能的android应用&#xff0c;应客户需求要将其改成一个SDK&#xff0c;由客户加到他们自己的app里边。 于是&#xff0c;我需要制作一个library&#xff0c;打包成aar文件&#xff08;jar:只有代码&#xff0c;没…

ATFX:美国通胀率平台期,或助力黄金延续涨势

ATFX金属&#xff1a;5月9日19:00至5月10日19:00&#xff0c;COMEX黄金的小时级别出现一波持续24小时的上涨走势&#xff0c;最高触及2385.3美元&#xff0c;累计涨幅2.78%&#xff0c;成为上周最佳的短线交易时机。R阻力线形成后&#xff0c;COMEX黄金进入下降通道&#xff0c…

2024年趋势:6款AI问答机器人工具推荐

众所周知&#xff0c;随着科技的发展&#xff0c;人工智能技术充斥着我们的生活。其中&#xff0c;AI问答机器人已经成为了我们生活和工作中不可或缺的一部分。它们不仅能够帮助我们快速获取信息&#xff0c;还能提供个性化的服务和建议&#xff0c;帮助我们快速解决问题。本文…

LayaAir引擎全面支持淘宝小游戏、小程序、小部件的发布

在最新的3.1版本和2.13版本中&#xff0c;LayaAir引擎已经全面支持了淘宝小游戏、小程序和小部件的开发和发布。这一重大更新&#xff0c;标志着LayaAir引擎与电商巨头阿里巴巴旗下的淘宝平台形成生态合作&#xff0c;在为广大开发者提供更加强大、高效的跨平台开发工具和解决方…

Java面试八股之什么是Java反射

什么是Java反射 基本概念 反射是Java语言的一个重要特性&#xff0c;它允许我们在运行时分析类、接口、字段、方法等组件的信息&#xff0c;并能够动态地操作这些组件&#xff0c;包括创建对象、调用方法、访问和修改字段值等。简单来说&#xff0c;反射提供了在程序运行时对…

#APPINVENTOR扩展插件之MQTT

1.APPINVENTOR网址&#xff1a; http://code.appinventor.mit.edu/http://code.appinventor.mit.edu/ 对应AI伴侣下载地址&#xff1a;http://code.appinventor.mit.edu/companions/MITAI2Companion.apkhttp://code.appinventor.mit.edu/companions/MITAI2Companion.apk 2.MQ…

ov泛域名证书1590元

OV SSL数字证书和DV SSL证书相比&#xff0c;审核比较严格&#xff0c;OV泛域名SSL证书审核严格、加密等级较高&#xff0c;因此吸引了很多注重网站安全性的开发者&#xff0c;不过&#xff0c;OV泛域名SSL证书也是有申请条件的&#xff0c;满足申请条件CA认证机构才会颁发SSL证…

31万奖金池等你挑战!IJCAI 2024 第九届“信也科技杯”全球AI算法大赛正式开赛!聚焦AI尖端赛题!

赛事概况 随着语音合成技术的不断进步,合成语音与真实语音之间的界限变得模糊,这不仅对数据安全构成威胁,也对科技伦理提出了新的要求。 第九届“信也科技杯”全球AI算法大赛聚焦于语音深度鉴伪识别领域,旨在激发全球算法爱好者和专家的创新潜力,共同应对由人工智能技术发展带来…

[猫头虎分享21天微信小程序基础入门教程]第5天:组件化开发与复用 ️

[猫头虎分享21天微信小程序基础入门教程]第5天&#xff1a;组件化开发与复用 &#x1f6e0;️ 第5天&#xff1a;组件化开发与复用 &#x1f6e0;️ 自我介绍 大家好&#xff0c;我是猫头虎&#xff0c;一名全栈软件工程师。今天我们将继续微信小程序的学习&#xff0c;重点…

【C++】学习笔记——stack和queue

文章目录 九、stack和queue1. stack和queue的介绍2. stack和queue的使用3. stack和queue的模拟实现4. deque的简单了解 未完待续 九、stack和queue 1. stack和queue的介绍 stack 就是我们常说的 栈 &#xff0c;而 queue 就是 队列 。栈就是 后进先出 的数据结构&#xff0c;队…

【软考】设计模式之观察者模式

目录 1. 说明2. 应用场景3. 结构图4. 构成5. 优缺点5.1 优点5.2 缺点 6. java示例 1. 说明 1.定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。2.也称为模型-视图模式、源-收听者模式或从属者…

.Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 发布到 Win7+

.Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 实测可以完整运行在 win7sp1/win10/win11. 如果用其他工具打包,还可以运行在mac/linux下, 传送门BlazorHybrid 发布为无依赖包方式 安装 WebView2Runtime 1.57 MB或136 MB 测试DEMO 发布为依赖包方式 安装 WebView2Runtime 1.…

JETBRAINS IDES 分享一个2099通用试用码!WebStorm 2024 版 ,支持一键升级

文章目录 废话不多说上教程&#xff1a;&#xff08;动画教程 图文教程&#xff09;一、动画教程激活 与 升级&#xff08;至最新版本&#xff09; 二、图文教程 &#xff08;推荐&#xff09;Stage 1.下载安装 toolbox-app&#xff08;全家桶管理工具&#xff09;Stage 2 : 下…

ChatGLM 本地部署指南(问题解决)

硬件要求&#xff08;模型推理&#xff09;&#xff1a; INT4 &#xff1a; RTX3090*1&#xff0c;显存24GB&#xff0c;内存32GB&#xff0c;系统盘200GB 如果你没有 GPU 硬件的话&#xff0c;也可以在 CPU 上进行推理&#xff0c;但是推理速度会更慢。 模型微调硬件要求更高。…

扫描工具xary

xary(被动扫描) 与bp进行联动 优点 流量小,结果精准 浏览器将流量传给bp8080端口,再从bp传给xray7777端口,最后到服务器 目的是可以从bp清晰的看到访问的流量包,发到xray后会这些流量包进行扫描,鼠标点击目标哪个功能就会进行功能点的扫描 .\xray.exe webscan --list…