简介
C语言很简练,但是还是有许多不足,所以 C++ 为了弥补这些不足增加了许多特性
命名空间
有这样一种情况,当 小 A 和小 B 为同一个程序写接口的时候,不小心有一些函数和变量重名了,在 C语言中这是不允许的,但是在 C++ 中,只要他们在不同的命名空间中,就可以允许
命名空间可以看做是两个房间,各自在各自的空间中运行就不会有重定义的错误
命名空间的关键字是 namespace
当定义了命名空间但是没有使用的时候会报错
之后使用命名空间有三种使用方式,第一种
利用 空间名::变量或函数名,的方式指定使用空间的符号
第二种方式,部分展开需要经常使用的变量
直接使用 using 指定的变量
可以看到 min 的值是 lrk 的 min
max 的值是 rkl 的 max
第三种 直接展开某个命名空间
直接
using namespace xxx
来将整个命名空间展开
缺省参数
在某一些情况下,函数传参需要使用默认值来方便使用
比如当初始化栈的大小的时候,如果已经知道大概要用的栈的大小,直接指定大小是很合理的,节省了许多修改空间的时间消耗
除此之外,当不知道空间大小的时候,就需要默认的值
具体使用方式
其中
缺省参数的设定不能够跳跃
必须从右向左设置
上图可以,下图不行
在调用的时候,缺省参数的使用也是先用右边,再用左边
函数重载
某些时候,我们会用到功能相同的函数,但是使用的参数不一样
在C语言中,我们不允许同名函数的出现,但是在C++中,允许同名函数的出现
但是有前提条件
使用的参数类型相同但是顺序不同
使用的参数类型不同
编译器能够识别,是因为内部的命名方式不同
在 Linux 中,函数重载,函数会重新命名
比如从上到下,通过编译后得到的汇编文件能够看到Linux的命名分别为
-Z + 函数名长度 + 函数名 + 参数首字母
为什么不利用返回参数来辨别函数?
因为在调用的时候,无法得到返回参数的信息,只能得到传参的信息
引用
在C 语言 中,多重指针是非常麻烦的
尤其是因为形参改变不改变实参,每次要在外部改变的时候都要利用指针
然后还要解引用等操作
在需要函数影响外部参数的情况下十分不实用
所以C++ 祖师爷觉得这个不行,加了引用来使用
引用就是取别名
比如一个人的名字叫张铁蛋,小名叫张三,都是指代同一个人
但是利用引用就能够很直观地使用对应名字的对应空间
引用的使用规则
引用在创建时就必须初始化,初始化后这个引用只指向指定空间不能修改
在这个规则下,因为引用在初始化之后就不能修改指向,假如我们实现链表的 Pop 某个值
让节点 next 是一个引用,但是 Pop之后,节点A 的 next 需要改变,用引用实现不了此功能,只能用指针
所以指针和引用是互相补充的
而且,引用的底层逻辑就是指针和指针的解引用,但是这个概念简化了参数的调用
一个变量可以有多个引用
引用权限放大的问题,如果一个值是 const 那他的引用必须是 const 而不能是一般的类型引用
引用作为函数参数的使用
如果我在主函数有一个变量 a ,引用就是直接指代 a 所指代的空间,而指针则需要解引用才能指向对应空间
当使用 ra 的时候就是直接使用空间本身
最典型的函数就是 swap
直接传形参是无法实现外部的参数交换的
必须要传引用或者是指针
运行结果
这是关于引用传参的使用方法
直接传引用,能够使用函数修改函数外部的参数
n 是 static 开辟在静态区,栈帧销毁后,n 并没有销毁,可以直接把 n 的空间都直接返回出去
但是如果 n 不是 static 这种写法就有问题
为什么?
因为如果 n 是临时变量,n会随着函数栈帧的销毁而消失,导致n 空间也消失
最终返回的引用是无效的,返回的那块空间是权限在操作系统那里,不再属于用户
传引用的好处
在函数的形参处和返回处,都会进行拷贝
建立栈帧前,会把实参拷贝到形参,返回销毁栈帧前,又会拷贝保存返回值
但是引用则是相当于直接将空间交给函数,省去了拷贝的过程,节省了时间
虽然引用的底层是指针,但是引用和指针有一定的区别
引用没有空引用,指针有空指针
指针可以不初始化,引用必须初始化
引用不能改变对象,但是指针可以
在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32
位平台下占4个字节)
引用比指针使用起来相对更安全
总结
希望大家看完,能够有所收获
如果有错误,请指出我一定虚心改正
动动小手点赞
鼓励我输出更加优质的内容