目录
那么如何访问域中的变量/函数呢?::这个符号叫做“域解析运算符”,通过这个符号可以访问命名空间、类或结构体的成员编辑
【前序】
这是我的第一篇c++文章,再以后写c++的过程中我也会穿插着写c语言以及数据结构初阶
1.c++前言
说到c++,很多人就感到有些害怕了,因为c++有些难,不过没有关系,可以跟着博主一起学习,共同进步。在这里不得不提到一个人BjarneStroustrup(本贾尼·斯特劳斯特卢普,这个翻译的名字不 同的地⽅可能有差异),也就是c++编程语言之父,那么c++一开始被创作的初衷呢,是祖师爷(c++之父)发现了一些c语言上的不足,所以就创造了c++来弥补c语言上的不足。那么就让我们开始吧!
2.第一个c++程序
大家来看这个程序,是不是有很多的疑问?<iostream>是什么?using name又是什么?cout是什么?不要急,咱们一点一点来
3.namespace:命名空间
在c++中存在着4大域:局部域,全局域,命名空间域,类域。而命名空间域就是今天要说的,namespace,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中存放的就是你的命名空间成员,可以是变量/类型/函数。
namespace存在的本质就是为了:不同的域中可以定义相同的变量(即除了main函数的局部域外,再创建一个命名空间域),而通过创造不同的域是为了解决同名变量冲突的问题。
那么如何访问域中的变量/函数呢?::这个符号叫做“域解析运算符”,通过这个符号可以访问命名空间、类或结构体的成员
例如上面的编程图片,namespace的名字叫做K,所以引用k中的变量就可以k::H;同样,可以看出,局部域跟命名空间域定义了相同的变量,但是这并不冲突!在namespace中也可以定义函数(如上图所示)。那么这个时候就要有人问了:namespace这个域会不会影响变量的生命周期呀?
答案是不会的!域只是影响了编译器的查找规则(编译器会先在局部域中查找,再去全局域中查找,)但是有了命名空间域,就可以指定域去查找了!
除此之外,域namespace只能定义在全局,当然他还可以嵌套定义。
那么嵌套定义,如上图,就可以用k::L::N,访问第二层命名空间域的变量。而且,等到以后写了项目工程,肯定会定义多个namespace,那么项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。
4.命名空间域的使用
C++标准库都放在⼀个叫std(standard)的命名空间中。
命名空间有三种使用方式:
1.指定命名空间访问,推荐这种⽅式。
2.using将命名空间中某个成员展开,也推荐这种
3. 展开命名空间中全部成员,风险较大,并不推荐。
5.c++的输入输出
c++的输入输出在<iostream>这个库中。
<<:流插入运算符,相当于c中的printf。
>>:流提取运算符,相当于c中的scanf。
而endl=endline,也就是换行的意思,但其实endl很复杂,因为这是一个函数,在这里咱们先不做讨论。
并且,c语言的printf不支持输出复合类型,但是c++的cout与cin支持复合类型的输出与输入。
6.缺省参数
1.声明或定义函数时为函数的参数指定一个缺省值(一般为形参),则调用函数的时候,若没有指定实参,则采用形参的缺省值;若指定了实参,就采用实参即可
2.缺省分为全缺省与半缺省。
。
3.且半缺省只能从右往左缺省,而实参给值,是从左往右依次给值。
7.函数重载
在同一个域中要是出现了同名的函数,那么该怎么办呢?这个时候就用到了函数重载。
函数重载要满足的几大特点:
1.参数个数不同
2.参数的顺序不同
3.参数类型不同
注意:返回值不同不能作为重载条件,因为调⽤时也⽆法区分(即返回值类型不同)
8.引用
引用就是起别名,比如《水浒传》李逵,有绰号:铁牛,黑旋风,但其实指的都是同一个人。
引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名。
类型& 引⽤别名=引⽤对象;(这里&不是取地址,是引用符号)
引用的特性:
1.引⽤在定义时必须初始化 。(这个是必须的)
2.⼀个变量可以有多个引⽤ 。
3.引⽤⼀旦引⽤⼀个实体,再不能引⽤其他的。(因为c++的引用不可以改变指向)
其实引用也有取地址的效果
第一个图片是c++版本,第二个图片是c版本,相信大家的慧眼已经发现了区别了吧,没错,这里&(引用)相当于取地址的效果了。就是给变量取别名,调用那个别名,就是在调用变量本身。
const引用涉及到一个权限的问题,给大家留个思考题,等博主下一期发表。
(以上内容仅我个人理解,若有错误,还请指出!)