文章目录
一、命名空间
先来句总结:命名空间的存在是为了解决变量、函数等一些自定义的成员名字冲突的问题
1.了解域的概念:
在C语言中,我们通常只接触全局域与局部域我们应该对这两个熟悉
定义的全局变量范围是从它开始的地方到文件的结尾,全局很多时候都是在最开始定义,所以它在全局域
而局部域通常都是在大括号(花括号)内,虽然大括号很多,一层套着一层等局部,但姑且整体称为局部域
在C++中拓展使用了类名空间域、类域,总结起来就有局部域、全局域、命名空间域、类域
先看一段比较有趣的名字冲突:

C++包含C大部分,用C++文件写C是可以的
可以看到以上图片出现的情况:
没包含stdlib.h的时候全局变量rand可以通过
包含stdlib.h之后因为头文件有rand()函数而和全局变量rand冲突了
如果在C语言上,只能麻烦自己修改了,这是程序员与库函数之间的名字冲突
但如果是多个程序员合作一个项目发生了命名冲突呢?“碾碎他们,谁菜谁改?”人走嘴还在
接下来解释一下命名空间
2.了解命名空间:
命名空间的存在是为了解决全局定义的成员的名字冲突问题,通常是函数名或全局变量名的冲突
那就说明,命名空间的成员还是存在于全局的,只不过是包装了起来
而这个包装通常需要指定或放开才能拿到里面的内容
C++变量搜索规则是:
先在局部域内找是否有这个变量,再到全局域找是否有这个变量,找不到就报错,不会到命名空间里面找
所以命名空间里面的内容虽然是全局的,但没有特定下编译器是找不到的
3.命名空间的创建与使用
一)命名空间的创建
创建一个命名空间的结构是:
namespace 命名空间名字
{
函数定义实现;
变量定义;
}
例如:
namespace winter
{
int func(int x, int y)
{
return x + y;
}
int M = 15;
}
命名空间内可以定义多个函数、多个变量,甚至可以套一层命名空间,当然也可以什么都不定义
一个文件可以有多个命名空间,多个程序员的冲突就解决了,各自使用命名空间的东西
二)命名空间的使用
命名空间有三种使用方法:
1)使用 :: 域作用限定符指定命名空间成员
英文状态下的两个冒号 ::域作用限定符
它的作用是可以指定哪个域的那些成员
:: 分左边右边,左边为哪个域,右边是那个域的什么成员,例如:
namespace winter
{
int func(int x, int y)
{
return x + y;
}
int M = 15;
}
int main()
{
int M = 0;
printf("%d\n", winter::M);
}
打印结果是15
这里域作用限定符 :: 如果左边没有指定域,则默认全局域
2)展开命名空间
展开命名空间的关键词是 using namespace 命名空间名
展开命名空间之后,命名空间的成员就会像全局的一样,可以直接引用
好处是方便使用,坏处是展开之后可能会与全局的冲突或与其他展开的命名空间冲突

第一个C++程序,这时候我们就能了解为啥头文件之后会有一句using namespace std;
std是头文件iostream的一个标准命名空间,而cout与cin分别是命名空间里面的成员
cout的英文是Console out(控制台输出),cin是Console in(控制台输入)
后面的符号除了左移右移之外,还有一个意思是可以看着数据流动,仔细看可以发现很形象
cin控制台内容流入变量,cout字符串流入控制台
可以跟多个输入输出
展开命名空间优点是使用时不用域作用限定符
缺点是展开了类似全局,容易发生冲突
3)指定展开命名空间某一个成员
指定展开某一个成员的格式是:
using 命名空间 :: 命名空间对应的成员
例如:
using std::cout;

可以看到指定展开命名空间某一个成员就不用域作用限定符,但其他的还需要
这种方法也很方便,在没有冲突下如果多次使用少量成员就可以尝试展开
命名空间的出现,解决了程序员与库、程序员与程序员直接一些成员重名的问题
顺提一句,在同一工程中,同名命名空间会合并
二、缺省参数
缺省参数描述的对象是函数,这里的缺省也叫默认
函数缺省参数有两种:全缺省与半缺省(不是固定一半,是部分的缺省)
缺省,你可以认为是调用函数时,你可以缺省那参数
1.全缺省
全缺省的例子:
int Add(int x = 10 ,int y = 20)
{
return x + y;
}
全缺省参数规则:
调用时如果没给参数,则默认使用函数定义里面给的参数
假如只给一部分参数,则函数会从左对应给参数,剩下的默认使用函数定义里给的参数
例如:Add(5);跳到函数时,参数列表里的变量在函数里的值会变成x = 5,y = 20
注意:不允许出现Add( , 5);没有这种规则
2.半缺省
半缺省的例子:
int Sub(int x,int y = 5)
{
return x - y;
}
半缺省参数规则:
调用函数时必须给没有缺省的变量对应的个数的值,不能出现函数列表变量没有缺省也不给值的现象
例如:不能出现Sub();
最低条件是Sub(一个参数); 也可以全部都给参数
注意:半缺省只能从右往左的缺省,意思就是,函数参数列表从右往左的赋值,不能跳跃

全缺省与半缺省的应用在函数如果没给参数规定时默认一个参数,当给参数之后就根据那个参数来变化
例如在顺序表初始化函数中,如果没给参数就默认开辟固定大小空间,给参数之后就开那么多空间,毕竟灵活
void Init(SeqList* p, int n = 4)
{
p->data = (int*)malloc(sizeof(int) * n);
//....
}
当不知道开多少空间时Init(&L);
当开20个空间时Init(&L, 20); 当开一百个空间时Init(&L, 100);
是否会觉得小题大做,但想想如果后面连续内存空间不够realloc扩容的话,会发现消耗很大
三、函数重载
函数重载的执行对象是函数
1.为啥要出现函数重载
函数重载的出现是为了解决函数名冲突而参数列表不一样的问题
在C语言中,函数名的冲突问题只能把冲突的函数名修改一下
不能出现同名函数这是C语言的规则
C++是为了补全C语言的缺点的,并创造更多更好的规则供人们使用
所以C++出现了可以名字相同,但参数列表类型不同的规则,这就叫函数重载
C:不能出现同名函数
C++:能出现同名函数,但参数列表类型不能一样
int Add(int x, int y)
{
return x + y;
}
double Add(double x, double y)
{
return x + y;
}
以上函数在C语言中编译无法通过,但在C++中编译可以通过

2.函数重载的规则
函数重载,是一个函数相对于另外一个同名函数的重载,只有一个函数不叫重载,可以是多个函数
函数重载站在函数的角度,你是我的重载函数,那我也是你的重载函数
函数重载规则如下:
1、函数参数列表类型不同
2、函数参数个数不同
3、函数列表类型顺序不同(本质也是类型不同)
例如:
先固定一个函数:
int Add(int x, int y)
{
return x + y;
}
1、函数参数列表类型不同:
double Add(double x, double y)
{
return x + y;
}
2、函数参数个数不同:
double Add(double x, double y, double z)
{
return x + y + z;
}
3、函数列表类型顺序不同(本质也是类型不同):
void func(int x, char c){}
void func(char x, int c){}
以上规则可以搭配使用,在类型不同时个数也不同,这样的重载函数在C++中也可以通过
注意:只有返回值不同,函数名、形参列表一样,不是重载函数,并且无法通过编译
这一点概念应该和Java中的重载大差不差
3.函数重载的简单使用方向
简单提一下思维:
例如当你需要加减法函数的时候,你不可能只需要整数加减法吧,所以可以用重载函数可以实现各类型的加减
发散思维,当你需要一个函数能实现其他功能时,可以重载一下该函数
总结
命名空间、缺省参数、函数重载都比较重要,适当练习一下可以提高记忆,也可以自己总结一下
命名空间对应的是域范围的访问
缺省参数对应的是函数调用时怎么缺省(当然需要定义那里有一点改变)
函数重载对应的是同名函数不同的参数列表
以上是我个人复习与总结,如有差异的地方请见谅

本文详细介绍了C++中的命名空间用于解决命名冲突,包括域的概念、命名空间的创建与使用方法;同时讲解了C++函数的缺省参数和全缺省、半缺省的区别,以及函数重载的作用、规则及其在实际编程中的应用。

1380

被折叠的 条评论
为什么被折叠?



