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

2024-05-08 13:52

本文主要是介绍命名空间、C++的输入输出、缺省参数(默认参数)、函数重载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

❤️‍🔥专栏系列:线性代数,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++函数支持重载详细介绍

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

这篇关于命名空间、C++的输入输出、缺省参数(默认参数)、函数重载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/970506

相关文章

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)