C++/初识
这部分是C++初识的最后一部分,虽然也就两部分
------------------------------------------
一、缺省参数
1- 缺省参数是指在函数定义的时候给一个缺省值。这样就可以在调用该函数时,不传参数,之间用给定的缺省值当参数,但如果传了参数,缺省值就不会起到作用(缺省参数还可以叫默认参数)
就像这样,缺省值就会代入进去
但如果实参给定了值,就会使用给的值
2- 另外,缺省参数分为全缺省和半缺省
- 全缺省就是全部参数都缺省,半缺省就是部分缺省
- 半缺省缺省时需要注意,C++规定,半缺省参数必须从右往左缺省,且必须连续缺省,不能跳着缺省
- 半缺省传参时需要注意,C++规定必须从左到右依次给实参,不能跳跃给实参
全缺省↓ 半缺省↓
半缺省错误形式↓
跳着写,编译器不会报错,但运行时就毁了,来分析一下: 1.参数给少了-> 因为传的第一个参数是给a的,而第二个参数没有缺省,又没有传值,所以出现参数给少了 2.缺少形参2的实参->这个就是因为中间跳着缺省了
由此可出,这里的报错不是因为没有参数传递过去,而是因为缺省参数的规定,至于为什么,不知道!只知道是规定
3- 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须在函数声明时给缺省值
运行后之间报错,规定如此,只能在声明时给缺省值
------------------------------------------------------
二、函数重载
函数重载是指:
函数名相同,但这些同名函数的形参必须不同,可以是参数个数或者类型,函数的返回值类型不同不算函数重载
这是最基础的使用,可以让一个函数名发挥不同的作用,要是在语言里面,这肯定是跑不过的
需要注意:无参数和全缺省的不传参调用存在歧义,尽量注意
就像这样,会出问题,编译器也能直接检查到
---------------------------------------------------------------
三、引用
引用不是新定义一个变量,而是给已经存在的变量取个别名(新的名字),编译器不会为引用变量开辟内存空间, 它和它引用的变量共用同一块内存空间。这就像是每个人会被亲戚以不叫大名的方式叫一样。
引用的使用:类型& 引用别名 = 引用对象;
C++有几个复用的C语言的符合,比如<<和>>,这里的引用也和取地址使用了同一个符号,注意使用方法即可区分
可以看到,这两个点地址是一样的,这也可以证明前面的,引用不会额外开空间。
这里还能看到,当改变 a1 时,a也跟着改变了,这是因为 a1 是 a 的别名,改变 a1 也就是改变 a
--------------还能给别名再取别名,使用和效果与上面一致
- 引用的特性
1- 引用必须在定义时初始化
2- 一个变量可以有多个引用
3- 引用一旦引用一个实体后,就不能再引用其他对象
演示
必须在定义时初始化
第三点这个特性不是因为会报错而不能引用其他对象,而是会造成不可预料的结果
- 引用的使用
1- 引用在实践中主要是于引用传参和引用做返回值中减少拷贝提高效率和改变引用对象时同时改变被引用对象
2- 引用传参跟指针传参功能是类似的,引用传参相对更方便一点
3- 引用和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代
4- 使用C++引用替代指针传参,目的是简化程序,避开复杂的指针
-----------------
引用传参
能够很简单的做到形参的改变影响实参 这如果不用引用,写起来是没有这么轻松的
原理:
因为 rx 是 x 的别名,所以修改 rx 时就相当于修改x,ry同理
--------------------------------
传引用返回
可以做到改变引用对象的同时改变被引用对象
这里只是用来演示,展示作用罢了 注意:传引用返回时,返回的值不能是在当前函数内的局部变量,必须得是出了函数作用域还在,才能使用传引用返回。不然就和野指针一样,风险未知
引用做不到的
--------------------------------------------------------------
四、const引用
- 可以引用 const 对象,但必须使用 const 引用。const 引用也可以引用普通对象,因为对象的访问权限可以缩小,但不能放大
a 到 b 是权限的平移,是可以的;c 到 d 是权限的缩小,也是可以的
这就是权限的放大,是不被允许的,编译阶段就不会通过
----------------------------------------------------
在使用引用时,也需要注意一下临时对象
所谓临时对象就是编译器需要一个空间暂存表达式的求值结果时临时创建的一个未命名的对象, C++中把这个未命名对象叫做临时对象,而且C++还规定临时对象是具有常性的,所以必须要用常引用(const引用)才可以。如:类型转换
在限制接收值时能限制只读,还能更好的接收各种类型的值
----------------------------------------
五、指针和引用的关系
C++中指针和引用就像两个性格迥异的亲兄弟,指针是哥哥,引用是弟弟,在实践中他们相辅相成,功能有重叠性,但是各有自己的特点,互相不可替代。
1- 语法概念上引用是一个变量的取别名不开空间,指针是存储一个变量地址,要开空间
2- 引用在定义时必须初始化,指针建议初始化,但是语法上不是必须的
3- 引用在初始化时引用一个对象后,就不能再引用其他对象;而指针可以再不断地改变指向对象
4- 引用可以直接访问指向对象,指针需要解引用才是访问指向对象
5- sizeof中含义不同,引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8byte)
6- 指针很容易出现空指针和野指针的问题,引用很少出现,引用使用起来相对更安全⼀些。
---------------------------------------------------
六、inline
inline主要是用来替换define的
现在来看inline
-------------------------------------------------------------
七、nullptr
在C++中,nullptr是用来替换null的
首先了解null的不足
演示一下↓
所以引入了nullptr
所以再C++内不在使用null,在需要用到null的地方全部使用nullptr替代