C++学习笔记

第十章 深入函数

学习一些函数的高级特性,比如函数的重载等。


10.1 函数的重载

我们可以将相同名字、但是不同类型的函数重复调用多次,来处理不同类型的数据。这里可以具体分为普通函数的重载和成员函数的重载。


10.2 函数的默认参数

在定义函数的时候,可以将它初始化一个值,这个值就叫函数的默认参数,也叫缺省参数。这样函数在调用的时候,如果有传递参数就用现成的,如果没有就用的这个默认参数。

这里要和重载函数做一个区分。

重载函数容易理解;但是对于默认参数,如果不加注释,很容易被忽略,而且很容易被有参数的同名函数覆盖。

重载函数重载的是参数类型,而默认参数重载的是参数的值。


10.3 构造函数的重载

函数都可以被重载,构造函数当然也具备这个特性。


10.3.1 成员变量的初始化    

对成员变量的初始化有很多方式。

一是在构造函数体中进行初始化。这要与重载构造函数配合使用。

二是就在构造函数的函数头进行初始化。具体操作就是在构造函数右边加冒号(:),然后是成员变量的名称和小括号(),小括号里面写入初始化的值或表达式。多个初始化成员用逗号隔开。

注意:由于常量和引用只能被初始化,不能被赋值,所以最好在构造函数的函数头中对常量和引用进行初始化。


10.3.2 成员变量的初始化与构造函数

当一个对象包容多个另一类对象的时候,被包容进去的子对象,在执行构造函数的时候,是按照成员列表的顺序进行构造的,而不是按照初始化顺序构造的。

析构顺序恰巧与构造顺序相反,最后构造的最先析构,也就是栈的后进先出原则。

最后再强调一下构造函数初始化的用途:如果成员是常量和引用,那么只能在构造函数头进行初始化。


10.3.3 复制构造函数

复制构造函数可以复制一个对象。

复制构造函数的函数名:与构造函数一样,都是完全和类名相同。

函数参数:该类的引用,比如 A(A&one)。这就是类A对象的一个复制构造函数。


默认复制构造函数的运行机理:由于它有指向类A的一个引用(引用名为one),因此就可以通过这个引用来访问类A的一个对象,从而复制该对象的成员变量。

这个工作由编译器自动完成。如果成员是指针,就涉及到深层或浅层复制的问题,后面会详细介绍,就需要我们人为干预了。


复制构造函数的用途:可以用来初始化另一个对象,把我们想要的那个对象的成员直接复制过来。


10.3.4 构造函数和NEW运算符

通过前面对栈的学习可知,系统会自动在栈中为每个变量开辟内存空间,以保证数值合理的被释放。

栈有优点,速度快,但是也有缺点,就是可存放的空间比较小,只有2M。

所以我们要用堆。堆是一大堆不连续的内存区域,在系统中由链表将其串接起来。所以它空间很大。


堆和栈的两点不同:

栈由系统自动分配,堆要由程序员申请。

栈空间小,只有2M。堆的上限由系统中有效的虚拟内存来决定,因此可获得的空间较大。


堆的相关用法:

指针

申请空间

指针 -> 操作

释放空间


10.3.5 再谈默认构造函数

只要自己创建了一个构造函数,编译器便不再自动为我们创建。如果还想要编译器提供的那种原生的构造函数,就必须自己再创建一个。


10.4 析构函数和delete运算符

delete运算符会自动调用析构函数,来释放掉new运算符所申请的内存空间。

默认析构函数:原理与用法和构造函数相同。

调用构造函数进行类型转换。尽量不用吧,没看到有多大好处,用explicit关键字对构造函数进行限定,就可以禁止这种转换。


10.5 浅层复制构造函数

默认复制构造函数+指针成员变量+堆空间。

如果析构掉一个,另一个再用的时候就会崩溃。原因也很简单,二者都指向同一块堆空间,在析构一个的时候,堆空间被释放掉了,另一个就变成了迷途指针,再调用就会崩溃。

默认复制构造函数的这种拷贝方式叫做成员拷贝,也叫浅拷贝。比较容易出现上述问题。


10.6 深层复制构造函数

为解决这个问题,我们必须创建自己的复制构造函数,并且在函数里为成员变量分配内存。两个对象的成员变量各自拥有自己的内存,就不会影响到对方。这种方式就是深层复制。



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值