> 作者简介:დ旧言~,目前大二,现在学习Java,c,c++,Python等
> 座右铭:松树千年终是朽,槿花一日自为荣。
> 目标:掌握c++在C语言的不足的使用(命名空间),对缺省参数和函数重载掌握熟练,和内敛函数与引用有深刻的理解。
> 毒鸡汤:车子有油、手机有电、卡里有钱,这就是安全感,指望别人都是扯淡。再牛的副驾驶,都不如自己紧握方向盘。
> 望小伙伴们点赞👍收藏✨加关注哟💕💕
🌟前言
终终终终于到C嘎嘎啦,喝了这么久的汤,终于可以吃口肉了,值得怀念。今天我们进入c++篇,c++的重要性我在这里就浅谈一下,目前c++已在Top2023榜上是第三名,可见c++这门语言依旧没有过时,耐人寻味。今天跟上小言子的步伐,迈进c嘎嘎世界。( auto关键字(C++11) 基于范围的for循环(C++11) 指针空值---nullptr(C++11))
⭐主体
咱们从七大板块学习,命名空间,C++输入&输出,缺省参数,函数重载,引用,内联函数,拓展。 前六大板块基本上是解决C语言缺陷问题,后面的拓展板块才算C嘎嘎,想必大家已经迫不及待的想吃肉了,那咱们一口一口慢慢吃,上菜!!!
🌙命名空间
在早期的C语言中是没有这块内容的,由于没有这个内容,在C语言中就有一个弊端,这个弊端就是在定义变量时与库的名冲突。为了解决这类问题,在c++中出现了命名空间这类知识点,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
💫命名空间定义
命名空间定义的关键是namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{} 中即为命名空间的成员。看下面图解是如何定义命名空间的:
重点:
💦命名空间中可以定义变量/函数/类型
💦命名空间可以嵌套
💦同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
在这里就不再提供案例了,咱们学到后期会详细介绍
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中
💫命名空间使用
💦 加命名空间名称及作用域限定符
💦 使用using将命名空间中某个成员引入
💦 使用using namespace 命名空间名称 引入
🌙C++输入&输出
在C语言中我们有printf输出,scanf输入,咱们祖师爷认为这种方法过于复杂,因此c++独特的输入和输出。
看图解:
这里捏大家就算见识一下咯,等到后面学各种流时会再次介绍。
std是C++标准库的命名空间,如何展开std使用更合理呢?
💦 在日常练习中,建议直接using namespace std即可,这样就很方便。
💦using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对
象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模
大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空+using std::cout展开常用的库对象/类型等方式。
🌙缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。没有合适的场合下使用这个知识点,可能大家理解不是很深刻,简单有个印象就行,咱们看看下面的图解:
注意:
缺省值必须是常量或者全局变量。
🌙函数重载
直接谈函数重载可能有唐突,因此我们直接放在场景中来解释,大家可能遇到这样的情况,实现两个数相加,有整形类型相加,有double类型相加,面对这个问题实现多个函数,就会造成代码过多,不利我们解读代码,这里就需要函数重载。那什么是函数重载捏?
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。
看图解:
这里我们要记住函数重载三个点,方可形成函数重载。
💦参数类型不同
💦参数个数不同
💦参数类型顺序不同
不知道大家有没有这样的问题,实现函数重载函数的返回值需要相同嘛,答案是不要相同,这个小知识点大家记住。
如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办
法区分。
🌙引用
不知道大家还记得单链表中需要改变链表的指向需要二级指针,而二级指针过于复杂,因此在c++中引出了引用这个知识点,而引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。具体是如何实现的捏,咱们看图解:
引用注意事项:
💦引用在定义时必须初始化(就好像用外号必须有你这个人)
💦 一个变量可以有多个引用(就好像一个人有多个外号)
💦引用一旦引用一个实体,再不能引用其他实体(就好比一个村子里面有两个张三但是不是同父母不能,因此取外号时,他们不能同时叫狗蛋,狗蛋只能属于一个张三)
使用引用时,使用范围只能缩小,不能放大,这是啥意思捏,举个栗子(刚出生的小孩,一开始不能叫人家大男孩,只能叫人家小宝宝,不可放大对别人叫法),看图解:
💫传值、传引用效率比较
以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。
💫引用和指针的区别
使用指针:需要开辟空间的,有相应的地址,
引用:
- 在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。
- 在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。
咱们看看上面的区别就行,乐呵乐呵。具体还是得看下面这段文字:
引用和指针的不同点:
- 引用概念上定义一个变量的别名,指针存储一个变量地址。
- 引用在定义时必须初始化,指针没有要求
- 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
- 没有NULL引用,但有NULL指针
- 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
- 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
- 有多级指针,但是没有多级引用
- 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
- 引用比指针使用起来相对更安全
🌙内联函数
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。看图解:
1. inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会
用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运
行效率。
2. inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建
议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不
是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性
3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址
了,链接就会找不到。
🌙拓展
💫auto关键字
随着程序的续写,程序越来越复杂,对变量的类型可能会忘记,因此在c++中引用了auto关键字,在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它,大家可思考下为什么?C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。看图解:
auto这个关键字就讲到这里,为什么捏?这个关键字存在歧义,在代码过多时,其实auto并不受欢迎,如果下一个程序员来写这段代码,都不知这些变量类型是啥,因此这个关键字要用少用,能不用就不用。
💫基于范围的for循环
这块知识点呢,并不适合在这里讲解,这里大家乐呵乐呵就行,毕竟C嘎嘎刚刚开始嘛,咱们看看下面图解:
💫指针空值nullptr
C语言中有一个NULL,有人说NULL是空,又人说NULL是0,还人说NULL是个宏,在这块在C语言中就有争议。其实捏,在传统的C语言中,NULL其实是一个宏。可以看出,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦。因此在c++中有了nullptr这个知识点
注意:
- 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入
- 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
- 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。
🌟结束语
今天是C嘎嘎初次见面也是C嘎嘎初阶,大家放心C嘎嘎后面的博客博主会继续更新,加油。时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小说手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。