C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))

1. C++关键字(C++98)

C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))_第1张图片

2. 命名空间

C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))_第2张图片
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用
域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污
染,namespace关键字的出现就是针对这种问题的。

命名空间定义

可以放变量,也可以放函数
此时程序中有三个a
C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))_第3张图片
可以通过编译
C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))_第4张图片
而我们打印一下,发现a是20C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))_第5张图片
为什么?

因为近

访问全局变量中的a
C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))_第6张图片
访问命名空间里的a
C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))_第7张图片
命名空间可以嵌套
C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))_第8张图片
访问N3里面的变量
C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))_第9张图片

如果在一个工程中出现了相同名字的命名空间,那么编译器就把这些名字相同的命名空间合并到一起了
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中
~~

命名空间的使用

1,直接在成员面前加N1::
2.using N1::a;		使用这种方法相当于把a作为全局变量
3.using namesapce  N1  告诉编译器,把当前N1这个命名空间里的全部内容当作全局变量

3. C++输入&输出

c中printf函数在打印时需要进行格式控制
以前是iostream.h 但为了和c语言区分 所以去掉.h。cout在系统中给定的一个名字叫做std的这个命名空间中

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

    注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,
    后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;旧
    编译器(vc 6.0)中还支持格式,后续编译器已不支持,因此推荐使用+std的方式。
  2. 使用C++输入输出更方便,不需增加数据格式控制,比如:整形–%d,字符–%c

C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))_第10张图片
在这里插入图片描述

4. 缺省参数

C++中函数的参数也可以配备胎

4.1 缺省参数概念
缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默
认值,否则使用指定的实参。
C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))_第11张图片
缺省参数分类
所有参数都带有默认值

void TestFunc(int a = 10, int b = 20, int c = 30)
{
cout<<"a = "< cout<<"b = "< cout<<"c = "< }

只有一部分参数带有默认值(从右往左给)
void TestFunc(int a, int b = 10, int c = 20)
{
cout<<"a = "< cout<<"b = "< cout<<"c = "< }

//a.h
void TestFunc(int a = 10);
// a.c
void TestFunc(int a = 20)
{}
// 注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省
值。

注意:
1 半缺省参数必须从右往左依次来给出,不能间隔着给实参匹配从左往右
2. 缺省参数不能在函数声明和定义中同时出现。(如果值不一样会冲突,一般会在声明中给出,)
3.缺省值必须是常量或者全局变量
4 C语言不支持(编译器不支持)

5. 函数重载

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。
比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者
是“谁也赢不了!”,后者是“谁也赢不了!”
5.1 函数重载概念
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形
参列表(参数个数 或 类型 或 顺序)必须不同
,常用来处理实现功能类似数据类型不同的问题

编译期间,编译器会推演实参的类型
C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))_第12张图片
参数类型一定只能是其中一个函数的全部类型
C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))_第13张图片
同一个作用域,同一个名字,参数列表不能一样,否则不能重载,与返回值类型相同没关系。
参数列表不同:个数,类型,类型的次序。

在c语言中不支持函数重载
在这里插入图片描述

C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))_第14张图片

为什么c中不支持函数重载?

C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))_第15张图片
编译可以通过,这个函数连函数体都没有怎么可能会编译通过?
在编译期间不会找函数具体的问题,因为编译器看到有函数声明,在当前文件没有,但其他文件中可能有
在链接期间。编译器找这个函数地址,找不到报错。

C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))_第16张图片
我们可以看到,我们在写函数时用的名字时Add,而编译器在找这个函数时,重新修改了这个名字,把Add修改为_Add。
在这里插入图片描述
让我们把文件改回成c++

在这里插入图片描述
C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))_第17张图片
编译器把名字重新命名为~~?Add@@YAHHH@Z~~
C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))_第18张图片
我们再次调用两个Add函数在c++环境下,我们可以看到报错,
(?Add@@YAHHH@Z)
(?Add@@YANNN@Z)

编译器重新给了两个函数不同的名字
我们再看一个例子C++起始(关键字,命名空间,缺省参数,函数重载(c语言为什么不支持函数重载))_第19张图片
**(?Add@@YAHHH@Z)
(?Add@@YANNN@Z)
(?Add@@YANHN@Z)**我们可以知道在VS编译器中,H代表整形,N代表浮点型。
而在c中编译器只是简单的加了一个前缀_

你可能感兴趣的:(c++学习之路)