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

news2026/5/2 7:02:34
这里我就不过多的进行描述了有兴趣的可以去网络搜索一番。总而言之从名称上面我们也可以看得出来C是在C的基础上进行不断地优化发展。事实上确实是这样C语言中90以上的语法在C中都适用。同时我们还要知道C作为众多编程语言中的一种它的排名始终是位于前列的并且涉及到的领域也是非常的多就比如以下几个领域操作系统以及大型系统软件开发、.....由此我们可见C的重要性。接下来我们话不多说进入正题。命名空间首先我们来看C语言中的下面这一段代码代码语言javascriptAI代码解释#includestdio.h #includestdlib.h int rand 10; int main() { printf(%d , rand); return 0; } //运行后会报错error C2365 : “rand”: 重定义以前的定义是“函数”这里报错是因为我们定义的变量rand它与库函数里的rand函数名称发生了冲突在C语言中对于此类问题是无法得到有效解决的除非就是自己换一个名称但是在C中针对此类问题是可以通过命名空间关键字namespace得到解决的。域在了解命名空间之前我们先来了解一下域这个概念我们目前所知的域就是全局作用域以及局部作用域局部域与全局域的使用以及生命周期都是不同局部域作用于局部只能在局部使用一般都是自己所在的{}内生命周期出了作用域就会自动销毁。而全局域则是作用于整个工程生命周期也是随着工程的结束而结束。 并且当局部与全局冲突时局部优先。就比如下面这段代码代码语言javascriptAI代码解释#includestdio.h int a 10;//作用于全局 void test() { int a 20;//只能在{}内使用 printf(%d , a);//局部与全局冲突时局部优先这里的a优先在局部域内查找 //如果找不到再去全局查找a进行匹配如果全局还是没找到则报错 //这里优先在局部匹配到了20所以打印结果为20 } int main() { test(); return 0; }但是假如一定要在test中打印的a是位于全局的a而不是局部a应如何做呢这里就涉及到了作用域限定符如下代码语言javascriptAI代码解释#includestdio.h int a 10;//作用于全局 void test() { int a 20;//只能在{}内使用 printf(%d , a);//局部与全局冲突时局部优先这里的a优先在局部域内查找 //如果找不到再去全局查找a进行匹配如果全局还是没找到则报错 //这里优先在局部匹配到了20所以打印结果为20 printf(%d , ::a); // ::前面有个空格意思为在全局域中查找a进行匹配这里的印出来的是10 } int main() { test(); return 0; }命名空间了解域后接下来我们来讲一下命名空间它的关键字为namespace具体使用namespace{}花括号内为命名空间的成员。它的作用是命名空间域也就是说将命名空间内的所有成员作为一个域但是注意一点就是命名空间域只影响成员的使用但是不影响生命周期。如下代码语言javascriptAI代码解释namespace qdy { // 命名空间中可以定义变量/函数/类型 int rand 10; int Add(int x, int y) { return x y; } struct Node { struct Node* next; int val; }; }了解它的用法后接下来我们该怎么使用命名空间呢具体有三种方法用using将命名空间全局展开在做项目时不建议使用做练习时可以利用指定命名空间 一般做项目时使用此方式用using 将命名空间常用展开代码语言javascriptAI代码解释//命名空间全局展开 using namespace std;//std为C标准库 //指定命名空间 std::cout hellow world\n std::endl; //命名空间常用展开 using std::cout; using std::endl;举个例子还是上面的rand假如我想自己使用自己的rand避免和库函数中的rand发生命名冲突可以这么来用代码语言javascriptAI代码解释#includeiostream #includestdlib.h namespace qdy { int rand 10; } int main() { qdy::rand;//这里的rand与qdy域里的rand进行匹配也就是10即11 printf(%d , qdy::rand);//打印结果为11 return 0; }同样假如我们在与他人同时进行某一项工程时最后为了避免与他人发生命名冲突我们就可以利用命名空间来完美解决这个问题但是假如放在C语言的环境下这个问题是解决不了的只能有一方主动服软改成不一样的名字才行。如下代码语言javascriptAI代码解释#includeiostream struct Node { struct Node* left; struct Node* right; int val; }; namespace qdy { struct Node { struct Node* next; int val; }; } int main() { struct qdy::Node Q;//这里上面两个结构体命名发生冲突都是叫Node //但是我们想要用下面的Node就可以利用命名空间 //这里的 Q就是指下面的结构体 return 0; }C输入/输出相信在我们入门C语言时的hello world是梦开始的地方在C语言中的输入输出为scanf与printf接下来我们看下面这样一段简单的代码代码语言javascriptAI代码解释#includeiostream using namespace std; int main() { int n 0; cin n; for (int i 0; i n; i) { cout hello world endl; } return 0; }这段代码执行后的结果是这样的在这里我们要知道cout标准输出对象写到控制台以及cin标准输入对象从键盘中读取它们两个的作用正是对应着C语言里的printf以及scanf。而endl的作用就相当于C语言里的\n换行符是流插入运算符是流提取运算符在C语言中我们使用scanf与printf时要手动加上固定的格式比如输入一个字符串要加上%s输入一个整形要加%d浮点型%f等。但是C中的输入输出则不需要手动输入格式C中的输入输出会自动识别类型。在使用cout以及cin与endl时需要包含头文件iostream,并且要按照命名空间的使用方式来使用stdstd为C标准库。缺省参数概念缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时如果没有指定实参则采用该形参的缺省值否则使用指定的实参。(C语言不支持缺省参数)具体是咋回事呢我们通过一段代码即可理解代码语言javascriptAI代码解释#includeiostream using namespace std; void test(int a 10) { cout a endl; } int main() { test();//10这里我没有传参数但是函数形参里定义了int a10,所以输出的就是10 test(20);//20这里我们传送参数20虽然形参里定义了a10但是由于我们传了参数所以a10就相当于形同虚设 //因此这里打印的是20 }是不是很好理解举个不起恰当的例子缺省参数有点类似生活中的”备胎“当没有别的选择时才用的到你但是只要有人出现你就gg了另外缺省参数还分为全缺省参数以及半缺省参数所谓全缺省参数就是函数的形参全都有指定的值而半缺省参数则是只有一部分的形参有指定值。如下代码语言javascriptAI代码解释//全缺省参数 void Func(int a 10, int b 20, int c 30); //半缺省参数 void Func(int a,int b10, int c20); //这里需要注意半缺省参数必须从右往左依次来给出不能间隔着给即不可以写成int a10,int b,int c30这种形式 //另外缺省参数不能在函数声明和定义中同时出现切记函数重载首先我们先了解一下什么是重载中国语言博大精深往往同一个词在不同的情况下有不同的意义就比如说我们在夸赞一个人时对他说你可真行但是当一个人把事情搞砸时我们再对他说你可真行。这里同样的语句却截然不同的意义这就是重载。函数重载则是函数的一种特殊情况C允许在同一作用域中声明几个功能类似的同名函数这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同常用来处理实现功能类似数据类型不同的问题。就比如下面的代码参数类型不同代码语言javascriptAI代码解释// 1、参数类型不同 //都为int int Add(int left, int right) { cout int Add(int left, int right) endl; return left right; } //都为double double Add(double left, double right) { cout double Add(double left, double right) endl; return left right; } int main() { Add(1,2);//3 Add(1.1.2.2);//3.3 //不会报错但如果是在C语言的环境下则会报错Add重定义具体原因后面会讲 return 0; }参数个数不同代码语言javascriptAI代码解释// 2、参数个数不同 void f() { cout f() endl; } void f(int a) { cout f(int a) endl; } int main() { f();//f() f(1);//f(int a) }形参的类型顺序不同代码语言javascriptAI代码解释//int 在前char在后 void f(int a, char b) { cout f(int a,char b) endl; } //char在前int 在后 void f(char b, int a) { cout f(char b, int a) endl; }可能我们会有个疑问为什么C语言不支持而C却支持呢这里涉及到了函数名修饰规则这里由于windows下的命名规则太过繁杂我们在Linux环境下进行演示。我们知道一个程序要运行起来要经历以下几个阶段预处理、编译、汇编、链接而在链接阶段链接器是如何来寻找我们调用的Add函数呢答案是通过编译器的函数名修饰规则这里我们分别演示C和C两种环境下链接器是如何查找Add的。因此我们得出结论在linux下采用gcc编译完成后函数名字的修饰没有发生改变。接下来我们观察C环境下通过这里就理解了C语言没办法支持重载因为同名函数没办法区分。而C是通过函数修饰规则来区分只要参数不同修饰出来的名字就不一样就支持了重载。另外如果两个函数函数名和参数是一样的返回值不同是不构成重载的因为调用时编译器没办法区分。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…