C++的简单介绍
C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。
为了解决软件危机, 20世纪80年代, 计算机界提出了OOP<(objectoriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。
1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计
命名空间
在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
我们来看一个例子:
此时的变量与库里面的冲突了,这时候我们就可以利用命名空间来解决这个问题👇
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后跟着一对{}即可,{}中即为命名空间的成员。
在这里,我们可以看到,打印出来的是函数rand的地址。编译器的默认查找是先去局部查找,局部没有rand,这时候就得去全局找,此时的头文件在预处理之时就会被展开,展开之后就会找到rand,所以打印出rand的地址。(这里如果为了更清晰一点,可以用%p打印)
这里需要注意到的是:局部找不到之后,去全局找,全局找不到之后,并不会去命名空间里找!!!
如何证明?很简单,我们可以在ST命名空间里在定义一个变量,然后去进行打印,看看结果是怎么样的:
到了这里,我们只是会定义命名空间,那怎么去使用命名空间,命名空间中成员该如何使用呢? 进行指定即可
对于命名空间:命名空间中的内容,既可以定义变量,也可以定义函数 、一些类型:
这里用命名空间的好处就在于防止发生命名冲突(不同的空间,不同的指定,不会造成冲突)👇
除此之外,命名空间还可以进行嵌套:
实际上,为了避免命名冲突,C++把官方库内容定义到了命名空间——std
(同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中)
C++输入与输出
我们前面说到,官方库的命名空间std,现在我们来使用cout标准输出(控制台)和cin标准输入(键盘)(必须包含< iostream >头文件 )来打印出我们的hello world
但是我们发现了一个问题:这样老是要指定域,比较麻烦。这时候命名空间有一个简单的使用方式:using namespace std;
这种方式把命名空间里面的内容进行展开:
这样子使用起来就极其方便了,但是也存在了不足的地方:
把全部都给展开了,如果我们定义与里面相同的变量,就会报错
所以对于我们日常的学习之中,自己的练习,不太存在冲突的问题,可以这么使用。
📝而对于一些特定的情况之下,我们也可以选择指定展开
对于C++的输入和输出,与C语言最大的不同就在于可以自动识别类型:
📝不过对于输出的控制不太好用,这里我们可以与C语言的printf互相配合使用。哪个好用我们就使用哪个。
早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h
缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参
🚩全缺省参数 :
参数默认从左往右传,中间不能隔着给值。
🚩半缺省参数 :
对于半缺省参数我们至少得传一个参数。
注意:
- 半缺省参数必须从右往左依次来给出,不能间隔着给.也就是说,缺省的参数是连续缺省的。
- 缺省参数不能在函数声明和定义中同时出现
下面,我们来看看缺省参数不能在函数声明和定义中同时出现的情况:
这是主要为了防止函数声明和定义之时缺省参数定义的不一致,出现歧义。
函数重载
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题
我们可以来简单举个例子:
我们在来看一下代码:这是不是函数重载:
可以肯定的是这是函数重载,但是如果无参调用是,会在这里发生了二义性(产生歧义)
对于函数重载的产生,我们先在这个地方简单略提一下:
- 为什么C++支持函数重载,而C语言不支持函数重载呢 ?
对于C语言不支持函数重载我们是可以很好理解的(在编译链接过程中,通过符号表找到函数名和函数地址),同名函数C语言是区分不了的。
而在C++中,可以去进行区分。C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载 。
但是在调用函数的时候我们并不知道调函数的哪个返回值,就是调用时的二义性,无法区分,调用时不指定返回值类型。所以对于C++的函数重载而言,函数返回值不同并不能构成函数重载,不是函数名修饰规则
结语
对于C++入门的第一篇博客,我们就先简单地介绍到这里,回顾一下,我们介绍了命名空间,输入与输出,以及缺省参数和函数重载,涉及的内容并不是很多。接下来,博主将会持续更新有关C++的博客🌹