C++入门教程详解之命名空间、函数重载、缺省参数

发布时间:2026/5/22 5:02:47

C++入门教程详解之命名空间、函数重载、缺省参数 一命名空间1.命名空间的意义 ① 在一个大型项目中往往会有很多函数、类、变量等如果不加以限制不同的函数或类很可能会使用相同的名称这样就会产生冲突。 ② 为了解决这个问题C引入了命名空间的概念可以把相关的函数、类、变量等放在同一个命名空间下从而避免冲突。 ③ 同时命名空间还可以提高程序的可读性和可维护性方便例如debug的时候定位问题。2.命名空间的定义定义命名空间需要使用到namespace关键字后面跟命名空间的名字然后接一对{}即可{} 中即为命名空间的成员。代码123456789101112131415161718192021222324252627282930//命名空间namespacestu{//命名空间中可以定义变量/函数/类型intAdd(intx,inty){returnx y;}intgoal 50;structNode{intdata;structNode* next;};//命名空间可以嵌套定义namespaceteacher{//命名空间中可以定义变量/函数/类型intAdd(intx,inty){returnx y;}intgoal 100;structNode{intdata;structNode* next;};}}注意一个命名空间就定义了一个新的作用域命名空间中的所有内容都局限于该命名空间中。3.如何使用命名空间中成员①加命名空间名称及作用域限定符代码12345678910111213141516171819202122232425262728293031323334353637​#include stdio.h//命名空间namespacestu{//命名空间中可以定义变量/函数/类型intAdd(intx,inty){returnx y;}intgoal 50;structNode{intdata;structNode* next;};//命名空间可以嵌套定义namespaceteacher{//命名空间中可以定义变量/函数/类型intAdd(intx,inty){returnx y;}intgoal 100;structNode{intdata;structNode* next;};}}intmain(){printf(%d\n, stu::goal);printf(%d\n,stu::teacher::goal);}​②使用using将命名空间中某个成员引入代码1234567usingstu::goal;//如果想使用嵌套空间中的goal可以用using stu::teacher::goal//但是两个不能同时存在否则会导致多次声明intmain(){printf(%d\n,goal);}③使用using namespace命名空间名称引入(相当于把命名空间全部展开)代码1234567usingnamespacestu;//想访问嵌套空间的goal可以using namespace stu::teacher//但是两个不能同时存在否则goal不明确intmain(){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格式后续编译器已不支持因此推荐使用iostreamstd的方式。三函数重载1.概念是函数的一种特殊情况C允许在同一作用域中声明几个功能类似的同名函数这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同常用来处理实现功能类似数据类型不同的问题。2.实例代码12345678910111213141516171819202122232425​#include iostreamusingnamespacestd;函数重载voidfun(intx,inty){cout int x,int y endl;}voidfun(doublex,doubley){cout double x,double y endl;}voidfun(){cout NULL endl;}intmain(){fun(2, 0);//参数类型不同fun(2.0, 0.0);//参数个数不同fun();return0;}​注意函数返回值不同不构成函数重载。3.为什么C能支持函数重载而C不行其实主要就是一句C有独特的函数名修饰规则。一个C/C程序的形成需要经过预处理、编译、汇编、链接。①预处理进行宏的替换、头文件展开、注释的删除(空格替换)。②编译将代码转化为汇编代码(这个阶段主要负责语法分析、符号汇总、词法分析、语义分析)。③汇编将汇编代码转化为二进制机器指令生成符号表。④链接汇编完成后会把对应源文件生成目标文件链接阶段就是把这些目标文件进行链接(这个过程很复杂)。

相关新闻