C++入门:命名空间、函数重载、缺省参数

news2024/11/25 16:35:10

目录

一:命名空间

1.命名空间的意义

2.命名空间的定义

3.如何使用命名空间中成员?

小结

二:C++的输入输出

三:函数重载

1.概念

2.实例

3.为什么C++能支持函数重载而C不行?

【1】先看一段C语言代码

【2】我们把上面的情况放到C++

四:缺省参数

1.概念

2.实例

3.缺省参数分类

【1】全缺省参数

【2】半缺省参数

4.注意点


一:命名空间

1.命名空间的意义

在一个大型项目中,往往会有很多函数、类、变量等,如果不加以限制,不同的函数或类很可能会使用相同的名称,这样就会产生冲突
为了解决这个问题,C++引入了命名空间的概念,可以把相关的函数、类、变量等放在同一个命名空间下,从而避免冲突
同时,命名空间还可以提高程序的可读性和可维护性,方便例如debug的时候定位问题。

2.命名空间的定义

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

代码:

//命名空间
namespace stu
{
	//命名空间中可以定义变量/函数/类型
	int Add(int x, int y)
	{
		return x + y;
	}

	int goal = 50;

	struct Node
	{
		int data;
		struct Node* next;
	};
	//命名空间可以嵌套定义
	namespace teacher
	{
		//命名空间中可以定义变量/函数/类型
		int Add(int x, int y)
		{
			return x + y;
		}

		int goal = 100;

		struct Node
		{
			int data;
			struct Node* next;
		};
	}
}

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


3.如何使用命名空间中成员?

加命名空间名称及作用域限定符

代码:

​#include <stdio.h>
//命名空间
namespace stu
{
	//命名空间中可以定义变量/函数/类型
	int Add(int x, int y)
	{
		return x + y;
	}

	int goal = 50;

	struct Node
	{
		int data;
		struct Node* next;
	};
	//命名空间可以嵌套定义
	namespace teacher
	{
		//命名空间中可以定义变量/函数/类型
		int Add(int x, int y)
		{
			return x + y;
		}

		int goal = 100;

		struct Node
		{
			int data;
			struct Node* next;
		};
	}
}
int main()
{
	printf("%d\n", stu::goal);
	printf("%d\n",stu::teacher::goal);
}

​

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

代码:

using stu::goal;
//如果想使用嵌套空间中的goal,可以用using stu::teacher::goal
//但是两个不能同时存在,否则会导致多次声明
int main()
{
	printf("%d\n",goal);
}

使用using namespace命名空间名称引入(相当于把命名空间全部展开)

代码:

using namespace stu;
//想访问嵌套空间的goal,可以using namespace stu::teacher
//但是两个不能同时存在,否则goal不明确
int main()
{
	printf("%d\n",goal);
}

小结

C++中即使是一些比较重要的声明定义(比如与输出有关的cout),也是放在一个命名空间中的,在没有展开命名空间或者引入成员的情况下,cout是可以做变量,函数名的


②如果要写一个较大的项目,上面三种使用命名空间中成员的方法
直接引入命名空间(展开)的方式是非常不好的,很容易造成命名冲突
(using namespace 命名空间)

如果并不需要频繁使用,我们可以用加命名空间名称及作用域限定符的方式来使用

(命名空间::成员)

如果只是需要频繁使用某一个成员,我们可以使用using将命名空间中单个成员引入
(using 命名空间::成员)


可以存在多个同名的命名空间,编译器最后会把他们合成一个

(比如定义两个同名命名空间,展开之后两个空间中的成员都可以使用)


二:C++的输入输出

代码:


说明:

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

②这里涉及到了类和对象、运算符重载、IO流、函数重载的知识,大家只需要先有个大致印象,后续的学习会一一解答这里的疑问。

      ●cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在< iostream >头文件中。

     ● <<是流插入运算符, >> 是流提取运算符。
     ●使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
     C++的输入输出可以自动识别变量类型(本质是函数重载)

早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间, 规定C++头文件不带.h旧编译器(vc 6.0)中还支持<iostream.h>格式,后续编译器已不支持,因此推荐使用<iostream>+std的方式


三:函数重载

1.概念

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

2.实例

代码:

​#include <iostream>
using namespace std;
函数重载
void fun(int x, int y)
{
	cout << "int x,int y" << endl;
}
void fun(double x, double y)
{
	cout << "double x,double y" << endl;
}
void fun()
{
	cout << "NULL" << endl;
}

int main()
{
	fun(2, 0);
	//参数类型不同
	fun(2.0, 0.0);
	//参数个数不同
	fun();
	return 0;
}

​

注意:函数返回值不同不构成函数重载。


3.为什么C++能支持函数重载而C不行?

其实主要就是一句:C++有独特的函数名修饰规则。

一个C/C++程序的形成需要经过预处理、编译、汇编、链接。

        ①预处理:进行宏的替换、头文件展开、注释的删除(空格替换)。

        ②编译:将代码转化为汇编代码(这个阶段主要负责语法分析、符号汇总

                          词法分析、 语义分析)。

        ③汇编:将汇编代码转化为二进制机器指令,生成符号表

        ④链接:汇编完成后会把对应源文件生成目标文件,链接阶段就是把这些目标文件

                       进行链接(这个过程很复杂)。

我们并不需要很在意这个过程的实现细节,要点在符号汇总和生成符号表


【1】先看一段C语言代码

main.c文件中没有Add函数的定义,但是存在声明,没有语法错误,可以通过编译。

Add.c文件中包含了Add函数的具体实现。

汇编完成后这两个源文件会生成对应符号表。

链接的过程中会进行符号表的合并,在main.obj(main.c汇编完成后生成的目标文件)中没有Add函数的定义,但是Add.obj中有,最后合并为_Add(0x200),可以找到Add函数的地址进行调用。

在上述基础上如果我们多定义一个同名函数,生成的符号表中两个函数地址都是有效的,无法区分应该调用那个,就会导致链接错误。

我们不难发现,C语言没办法处理这种情况是因为符号名相同导致的冲突,如果我们在生成符号表的时候依据函数参数的不同来生成不同符号名,不就可以解决这种情况了吗?


【2】我们把上面的情况放到C++

 通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了 重载

其中返回值并没有纳入修饰规则,因此只有返回值不同无法构成函数重载


四:缺省参数

1.概念

       缺省参数是声明或定义函数时为函数的参数指定一个缺省值在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参


2.实例


3.缺省参数分类

【1】全缺省参数

【2】半缺省参数


4.注意点

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

缺省参数不能在函数声明和定义中同时出现,建议缺省参数只在声明中设定

③缺省值必须是常量和全局变量

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

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

相关文章

基于单片机的七彩音乐喷泉设计

目录 一、方案流程及技术规格书设计 二、系统硬件电路设计 三、软件编写及调试 四、系统调试测试与分析 前言 随着时代的进步&#xff0c;人们对生活质量的要求也在不断提升&#xff0c;因此&#xff0c;51单片机七彩音乐喷泉系统应运而生&#xff0c;它不仅可以满足人们对…

I.MX RT1170加密启动详解(3):HAB加密启动原理

上一节使用对镜像进行签名认证&#xff0c;这可以防止镜像被篡改。但我们还是希望Flash中的程序不会被别人看到&#xff0c;所以这就需要加密启动了。 文章目录 1 HAB加密启动流程2 扩展知识&#xff1a; DCP和SNVS 1 HAB加密启动流程 如下图所示就是HAB加密启动的整个流程&a…

蓝桥杯国赛备赛(嵌入式组)

一、数码管&#xff08;拓展板&#xff09;&#xff08;共阴接法&#xff09; 引脚控制 PA3 :RCLK 串型存储时钟输入 &#xff08;上升沿有效&#xff09; PA2 :SCK 串行移位时钟输入&#xff08;上升沿有效&#xff09; PA1 :SER 串型数据输入 发送数据时先发高位&#xff1…

【UnityShader入门精要】【总结记录】【第二章-1】

☀️博客主页&#xff1a;CSDN博客主页 &#x1f4a8;本文由 萌萌的小木屋 原创&#xff0c;首发于 CSDN&#x1f4a2; &#x1f525;学习专栏推荐&#xff1a;面试汇总 ❗️游戏框架专栏推荐&#xff1a;游戏实用框架专栏 ⛅️点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd;&a…

使用 Access SQL 插入、更新和删除表格记录

参考链接 使用 Access SQL 插入、更新和删除表格记录 | Microsoft Learnhttps://learn.microsoft.com/zh-cn/office/vba/access/concepts/structured-query-language/insert-update-and-delete-records-from-a-table-using-access-sql 将记录插入表格 基本上有两种方法可以向…

client-go架构与原理介绍

个人博客 一、架构展示 client-go 库中的各种组件架构如下图所示&#xff1a; 二、目录结构 client-go 是用 Golang 语言编写的官方编程式交互客户端库&#xff0c;提供对 Kubernetes API server 服务的交互访问。 其源码目录结构如下&#xff1a; . ├── discovery …

再识openmmlab,用mmDeploy实现部署的前期需要了解一些内容

OpenMMLab 是一个用于学术研究和工业应用的开源算法体系&#xff0c;于2018年年中开始&#xff0c;由 MMLab&#xff08;香港中文大学多媒体实验室&#xff09;和商汤科技联合启动。 如果第一接触的话&#xff0c;还是建议参考官方环境配置教程&#xff1a;Windows 环境配置 -…

Midjourney万能高清咒语,真正的近看也美

明明我都拿人家的图垫图了&#xff0c;为什么质量还是很差&#xff1f; 明明别人都把咒语分享出来了&#xff0c;为什么质量还是很差&#xff1f; 今天我们就来解决这两个问题&#xff0c;看到就是缘分&#xff0c;点点手指来个小心心不过分吧&#xff0c;哈哈 什么你在怀疑我的…

Spring Boot + ElasticSearch实战之CRUD及多数据源配置

概述 本文记录工作中使用Spring Boot ElasticSearch的实战&#xff0c;Spring Boot版本&#xff1a;2.1.6.RELEASE。 基础 Spring Boot已是Java开发标配&#xff0c;使用SB提供的starter&#xff0c;简单高效。 配置 引入依赖&#xff1a; <dependency><groupI…

Rocketmq如何保证消息不丢失

如果想要保证消息不丢失就要知道&#xff0c;消息可能出现丢失得地方。 1.producer发送消息 2.Broker存储消息 3.Consumer消费消息 4.Broker主从切换 下面一共有9个维度可以保证消息不丢失。 目录 维度一&#xff1a;同步发送 维度二.异步发送 维度三.刷盘策略 维度四…

数据库期末复习(2)

关系数据库 图1 上图为思考题1的答案 \d student #查看完整性约束 模式和实例 关系的模式:关系有哪些、关系又什么类型、关系的约束时什么&#xff0c;一般来说关系的模式一般比较稳定&#xff0c;不会随着动态的变化而变化。 关系的实例:关系的实例一般随着变化的次数比较…

体验 InsCode AI,原来 AI 也扛不住互联网黑话

CSDN AI写作助手上线了&#xff01;InsCode AI 创作助手不仅能够帮助用户高效创作文章&#xff0c;而且能够作为对话式AI回答你想知道的问题。成倍提高生产力&#xff01;以下是我的体验分享 一、你平时会使用这类AI工具吗&#xff1f;你对这类型的工具有什么看法&#xff1f;…

RPC(2):RPC简介

1 RFC RFC(Request For Comments) 是由互联网工程任务组(IETF)发布的文件集。文件集中每个文件都有自己唯一编号&#xff0c;例如&#xff1a;rfc1831。目前RFC文件由互联网协会(Internet Society&#xff0c;ISOC)赞助发行。 RPC就收集到了rfc 1831中。可以通过下面网址查看…

微信小程序websocket使用protobuf,发送arraybuffer

❤️砥砺前行&#xff0c;不负余光&#xff0c;永远在路上❤️ 目录 前言一、如何在小程序websocket中使用 Protobuf 发送buffer二、使用过程遇到的坑&#xff08;版本问题&#xff09;1、需要注意下Protobuf版本 使用 protobufjs6.8.6最好&#xff0c;我在使用的时候安装7.多 …

1_7后端优化

后端优化是指将一段时间内相机所有关键帧的位姿、内参、每个点3维坐标作为参数进行优化&#xff0c;得到最优的内、外参&#xff1b;利用的方法主要是Bundle Adjustment。 所谓Bundle Adjustment可以理解为从任意特征点发射出来的几束光线&#xff0c;它们会在几个相机的成像平…

寄存器-汇编复习(2)

通过阅读本文小节内容&#xff0c;可以清楚的明白汇编承接的能力和机器语言&#xff0c;高级语言之间的表达关系。文中虽然讨论16位cpu&#xff0c;最新的64或以后的128理论都一样的&#xff0c;类推就好了。 继续将 通用寄存器-汇编复习(1)_luozhonghua2000的博客-CSDN博客 …

很多人打商标的主意,悄悄埋伏

很多人在打商标的主意&#xff0c;等着抢劫呢 等你的品牌结了果实&#xff0c;然后出手勒索 趣讲大白话&#xff1a;鬼子进村&#xff0c;打枪的不要 【趣讲信息科技183期】 **************************** 有些公司申请几千件商标 有公司一个月申请100件 春江水暖贼先知 有一条…

WSL2网络配置

WSL2越来越好用了&#xff0c;但是在windows下使用clash时&#xff0c;配置WSL2的网络很麻烦&#xff0c;通常使用设置环境变量export ALL_PROXY"http://127.0.0.1:8000"的方式有很大的弊端&#xff0c;例如pip和conda就不会走代理。 经过我亲身体验&#xff0c;最好…

基于小脑模型神经网络的轨迹跟踪研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

模拟退火算法(附简单案例及详细matlab源码)

作者&#xff1a;非妃是公主 专栏&#xff1a;《智能优化算法》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 专栏推荐序一、概论二、物理退火1. 加温…