【C++】走进C++的世界

举报
平凡的人1 发表于 2022/11/15 23:49:33 2022/11/15
【摘要】 C++的简单介绍C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP<(objectoriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面...

C++的简单介绍

C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适

为了解决软件危机, 20世纪80年代, 计算机界提出了OOP<(objectoriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。
1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计

image-20220915230935320

命名空间

在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染namespace关键字的出现就是针对这种问题的。

我们来看一个例子:

img

此时的变量与库里面的冲突了,这时候我们就可以利用命名空间来解决这个问题👇

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后跟着一对{}即可,{}中即为命名空间的成员。

image-20220915233302750

在这里,我们可以看到,打印出来的是函数rand的地址。编译器的默认查找是先去局部查找,局部没有rand,这时候就得去全局找,此时的头文件在预处理之时就会被展开,展开之后就会找到rand,所以打印出rand的地址。(这里如果为了更清晰一点,可以用%p打印)

这里需要注意到的是:==局部找不到之后,去全局找,全局找不到之后,并不会去命名空间里找==!!!

如何证明?很简单,我们可以在ST命名空间里在定义一个变量,然后去进行打印,看看结果是怎么样的:

image-20220915233828664

到了这里,我们只是会定义命名空间,那怎么去使用命名空间,命名空间中成员该如何使用呢? 进行指定即可

image-20220915234342572

对于命名空间:命名空间中的内容,既可以定义变量,也可以定义函数 、一些类型:

image-20220915235145790

这里用命名空间的好处就在于防止发生命名冲突(不同的空间,不同的指定,不会造成冲突)👇

image-20220915235507948

除此之外,命名空间还可以进行嵌套:

image-20220915235909529


实际上,为了避免命名冲突,C++把官方库内容定义到了命名空间——std

(同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中)

C++输入与输出

我们前面说到,官方库的命名空间std,现在我们来使用cout标准输出(控制台)和cin标准输入(键盘)(必须包含< iostream >头文件 )来打印出我们的hello world

image-20220916001534810

但是我们发现了一个问题:这样老是要指定域,比较麻烦。这时候命名空间有一个简单的使用方式:using namespace std;

这种方式把命名空间里面的内容进行展开:

image-20220916001906836

这样子使用起来就极其方便了,但是也存在了不足的地方:

==把全部都给展开了,如果我们定义与里面相同的变量,就会报错==

image-20220916002215436

所以对于我们日常的学习之中,自己的练习,不太存在冲突的问题,可以这么使用。

📝而对于一些特定的情况之下,我们也可以选择指定展开

image-20220916002656736

对于C++的输入和输出,与C语言最大的不同就在于可以自动识别类型:

image-20220916003401687

📝不过对于输出的控制不太好用,这里我们可以与C语言的printf互相配合使用。哪个好用我们就使用哪个。

早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h


缺省参数

缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参

image-20220916004449811

🚩全缺省参数 :

image-20220916072329518

参数默认从左往右传,中间不能隔着给值。

🚩半缺省参数 :

对于半缺省参数我们至少得传一个参数。

image-20220916073053008

注意:

  • ==半缺省参数必须从右往左依次来给出,不能间隔着给.也就是说,缺省的参数是连续缺省的。==
  • ==缺省参数不能在函数声明和定义中同时出现==

下面,我们来看看缺省参数不能在函数声明和定义中同时出现的情况:

image-20220916074813867

image-20220916074908563

这是主要为了防止函数声明和定义之时缺省参数定义的不一致,出现歧义。

函数重载

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题

我们可以来简单举个例子:

image-20220916103620574

我们在来看一下代码:这是不是函数重载:

image-20220916105843131

可以肯定的是这是函数重载,但是如果无参调用是,会在这里发生了二义性(产生歧义)

对于函数重载的产生,我们先在这个地方简单略提一下

  • 为什么C++支持函数重载,而C语言不支持函数重载呢

对于C语言不支持函数重载我们是可以很好理解的(在编译链接过程中,通过符号表找到函数名和函数地址),同名函数C语言是区分不了的。

而在C++中,可以去进行区分。C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载 。

但是在调用函数的时候我们并不知道调函数的哪个返回值,就是调用时的二义性,无法区分,调用时不指定返回值类型。所以对于C++的函数重载而言,函数返回值不同并不能构成函数重载,不是函数名修饰规则


结语

对于C++入门的第一篇博客,我们就先简单地介绍到这里,回顾一下,我们介绍了命名空间,输入与输出,以及缺省参数和函数重载,涉及的内容并不是很多。接下来,博主将会持续更新有关C++的博客🌹

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。