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

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

一、命名空间

先来句总结:命名空间的存在是为了解决变量、函数等一些自定义的成员名字冲突的问题

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 = 0printf("%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.函数重载的简单使用方向

简单提一下思维:

例如当你需要加减法函数的时候,你不可能只需要整数加减法吧,所以可以用重载函数可以实现各类型的加减
发散思维,当你需要一个函数能实现其他功能时,可以重载一下该函数

总结

命名空间、缺省参数、函数重载都比较重要,适当练习一下可以提高记忆,也可以自己总结一下

命名空间对应的是域范围的访问
缺省参数对应的是函数调用时怎么缺省(当然需要定义那里有一点改变)
函数重载对应的是同名函数不同的参数列表

以上是我个人复习与总结,如有差异的地方请见谅
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值