第二周的课程是对第一周课程类设计的延伸。在第一周的课程中,讲了不带指针的一般类的设计,重点讲了操作符的重载,及构造函数的列表初始化等。而在第二周的课程中,对含有指针的类(class with pointer)类重点部分做了详细的说明,主要讲述了以下几个概念,而这些概念对今后类的设计(OOP)有很好的指导意义。
拷贝构造
如果一个构造函数的第一个参数是自身类类型的引用,且其他额外参数都有其默认值,则此构造函数为拷贝构造函数。
Foo(const Foo&)
拷贝构造函数通常不应该是explicit(这个内容涉及到类型转换)
当类中的成员需要分配类外的资源时,通常的特征是在成员中含有指针变量,这个时候往往采用系统自带的合成拷贝构造函数不能达到要求。需要重新设计拷贝构造函数。顾名思义,拷贝构造就是在构造函数(ctor)中执行深拷贝工作。
但正如<<C++ Primer>>中建议的那样,使用vector对象或者std命名空间下的string对象,能够避免分配和释放内存空间所带来的复杂性。也就是说,使用string或者vector来替代字符指针(char*)和数组,能够使用系统默认的拷贝构造函数而不需要重写。
** 拷贝构造函数被用来初始化非引用类类型参数**
拷贝赋值
这个概念实际上是对第一周学习的的操作符重载的延伸,即“=”号为赋值符,拷贝赋值实际上是对拷贝赋值运算符的重载。赋值运算符返回一个指向其左侧运算对象的引用.
** 如果一个运算符是一个成员函数,其左侧运算对象就绑定到隐式的this参数.其右侧运算对象作为显式参数传递.**
析构函数
析构函数执行与构造函数相反的操作。析构函数的主要作用是释放对象所使用的动态分配的资源,并销毁对象的非static数据成员。
** 需要析构函数的类也需要拷贝构造和拷贝赋值**
也就是说,如果一个类需要析构函数,那么基本可以肯定的说,也需要拷贝构造和拷贝赋值。