命名空间、C++的输入输出、缺省参数(默认参数)、函数重载

server/2024/10/18 16:50:03/

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++,linux

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

命名空间

命名空间的使用

C++的输入输出

缺省参数(默认参数)

全缺省参数

半缺省参数(部分缺省)

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

不允许声明和定义同时给缺省参数

函数重载

函数重载的特点包括:

为什么C++支持函数重载,而C语言不支持函数重载呢?


命名空间

在 C++ 中,命名空间(Namespace)是一种用于组织代码和避免命名冲突的机制。通过命名空间,可以将一系列的标识符(如变量、函数、类等)封装在一个命名空间中,从而在不同的作用域中避免名称冲突。

命名空间的语法形式如下:

namespace namespace_name 
{// 声明或定义一些变量、函数、类等
}

命名空间的使用

namespace E
{int a = 10;int b = 20;int Add(int left, int right){return left + right;}int Sub(int left, int right){return left - right;}
}加命名空间名称及作用域限定符
int main()
{printf("%d\n",E::a);return 0;
}使用using将命名空间中成员引入
using E::b;
int main()
{printf("%d\n", E::a);printf("%d\n", b);return 0;
}使用using namespace 命名空间名称引入
using namespace E;
int main()
{printf("%d\n", E::a);printf("%d\n", b);Sub(10, 20);return 0;
}

using namespace std;

std 这个空间,包含一些输入输出,例如 cout,cin对象

C++的输入输出

在 C++ 中,输入输出通常使用 iostream 库来实现。主要的输入输出对象是 cincout

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

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

2. 使用C++输入输出更方便,不需增加数据格式控制,比如:整形--%d,字符—%c

using namespace std;
int main()
{char s[10];cin>>s;cout<<s<<endl;cout<<'A'<<endl;cout<<65<<endl;return 0;
}

缺省参数(默认参数)

在 C++ 中,函数的默认参数(也称为缺省参数)允许在函数声明中为参数提供默认值。这意味着在调用函数时,如果没有为相应的参数提供值,则会使用参数的默认值。默认参数在函数声明中指定,而不是在函数定义中。

事例

#include<iostream>
using namespace std;void test(int a=1)
{cout<<a<<endl;
}
int main()
{test();//没有传参时,使用参数的默认值test(0);//传参时,使用指定实参return 0;
}

需要注意的是,对于函数的多个参数,只能在参数列表的末尾提供默认参数,不能在中间部分提供。例如:

// 错误示例:不能在非末尾参数提供默认参数
void example(int a = 1, int b, int c = 3);

正确的写法是将默认参数放在参数列表的末尾:

// 正确示例:将默认参数放在参数列表的末尾
void example(int a, int b, int c = 3);

全缺省参数

每个参数都有默认值

void test(int a=1,int b=2,int c=3)
{cout<<a<<endl;cout<<b<<endl;cout<<c<<endl;
}

半缺省参数(部分缺省)

部分参数有默认值

void test(int a,int b,int c=3)
{cout<<a<<endl;cout<<b<<endl;cout<<c<<endl;
}
半缺省参数必须从右向左依次给出,不能间隔
void test(int a=0,int b,int c=3)//错误的
void test(int a,int b=2,int c=3)//正确的

不允许声明和定义同时给缺省参数
//a.h
void test(int a = 10);
// a.c
void test(int a = 20)
{}

注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值

函数重载

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。

比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!”

在 Linux 中,函数重载与其他 C++ 编译环境中的函数重载方式相同。函数重载是指在同一个作用域内定义多个具有相同名称但参数列表不同的函数。在调用这些函数时,编译器会根据参数列表的不同来确定调用哪个函数。

事例

using namespace std;
int test(int a,int b)
{return a+b;
}
double test(double a,double b)
{return a+b;
}
long test(long a,long b)
{return a+b;
}
int main()
{cout<<test(1,2);cout<<test(1.0,2.0);cout<<test(1L,2L);return 0;
}

函数重载的特点包括:

1)函数名称相同。
2)参数列表不同(包括参数类型、个数、顺序等)。
3)返回类型可以相同也可以不同,但不能仅仅通过返回类型来进行函数

为什么C++支持函数重载,而C语言不支持函数重载呢?

在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。
test.cpp
预处理 头文件展开/宏替换/去掉注释/条件编译
test.i
编译 检查语法,生成汇编代码(指令级代码)
test.s
汇编 将汇编代码生成二进制机器码
test.o
链接 合并链接,生成可执行程序

实际我们的项目通常是由多个头文件和多个源文件构成,而通过我们C语言阶段学习的编译链接,我们可以知道,【当前a.cpp中调用了b.cpp中定义的Add函数时】,编译后链接前,a.o的目标文件中没有Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。那么怎么办呢?

所以链接阶段就是专门处理这种问题,链接器看到a.o调用Add,但是没有Add的地址,就会到b.o的符号表中找Add的地址,然后链接到一起。那么链接时,面对Add函数,连接器会使用哪个名字去找呢?这里每个编译器都有自己的函数名修饰规则。

Linux下gcc的修饰规则简单易懂,下面我们使用了gcc演示了这个修饰后的名字。

通过下面我们可以看出gcc的函数修饰后名字不变。而g++的函数修饰后变成【_Z+函数长度+函数名+类型首字母】。

在linux下,采用gcc编译完成后,函数名字的修饰没有发生改变,采用C++编译器编译后结果
结论:在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改后的名字中

总结:通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。另外我们也理解了,为什么函数重载要求参数不同!而跟返回值没关系


C++函数支持重载详细介绍

  🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸 


http://www.ppmy.cn/server/28046.html

相关文章

Nginx实现端口转发与负载均衡配置

前言&#xff1a;当我们的软件体系结构较为庞大的时候&#xff0c;访问量往往是巨大的&#xff0c;所以我们这里可以使用nginx的均衡负载 一、配置nginx实现端口转发 本地tomcat服务端口为8082 本地nginx端口为8080 目的&#xff1a;将nginx的8080转发到tomcat的8082端口上…

TCP协议为什么使用三次握手进行连接?

回答: TCP协议使用三次握手来建立一个可靠的连接&#xff0c;确保两端的通信设备都准备好进行数据传输。这个过程涉及三个步骤&#xff1a; SYN&#xff1a;客户端发送一个SYN&#xff08;同步序列编号&#xff09;包到服务器&#xff0c;以开始新的连接。SYN-ACK&#xff1a;…

OpenHarmony实战开发-使用通用事件、焦点事件

基本概念 焦点 指向当前应用界面上唯一的一个可交互元素&#xff0c;当用户使用键盘、电视遥控器、车机摇杆/旋钮等非指向性输入设备与应用程序进行间接交互时&#xff0c;基于焦点的导航和交互是重要的输入手段。 默认焦点 应用打开或切换页面后&#xff0c;若当前页上存在…

python gmssl SM4不填充加解密

问题描述 使用gmssl(python版本)进行SM4加/解密时结果与国标(GMT0002)不符&#xff0c;或解密失败&#xff0c;原因是gmssl默认使用PKCS7填充&#xff0c;国标文档里的样例是没有填充的。 解决方法 方法一&#xff1a;创建CryptSM4对象时将填充模式设为-1。这是笔者推荐的方法…

如何给无法修改的类增加一个父类?mlir某机制

一.从这个问题说起 如果我们使用了一个库&#xff0c;这个库的代码是无法修改的&#xff0c;其中包含一个类class A。 我们在代码中定义了一个类B,如何让A继承自我的写的B呢&#xff1f; 二.奇怪的代码 &#xff1a; class Conv2dOp : public ::mlir::Op<Conv2dOp, ::mlir…

在UI界面中播放视频_unity基础开发教程

在UI界面中播放视频_unity基础开发教程 前言操作步骤结语 前言 之前我写过一篇在场景中播放视频的文章&#xff0c;但是在开发中有时候也会在UI的界面中播放视频&#xff0c;这期我们做一下在UI的界面中播放视频。 操作步骤 首先在场景中创建一个Raw Image&#xff0c;UI->…

微信小程序 - 登录(切屏后继续倒计时)

屏幕休眠或后台运行倒计时暂停问题 updateTime: function () {let promise new Promise((resolve, reject) > {var beginTime new Date().getTime();let setTimer setInterval(() > {var newTime new Date().getTime();var dTime (newTime - beginTime) / 1000;dTim…

【Qt之·路径获取】

系列文章目录 文章目录 前言一、使用相对路径1.1 相对路径1.2 绝对路径1.3 QDir类1.4 QFileDialog对话框 二、示例2.1 示例一 总结 前言 在进行Qt开发时&#xff0c;经常需要获取文件的路径&#xff0c;如图片、音频、配置文件等。路径的获取可以通过直接指定绝对路径或者使用相…