成员变量为私有的要对它们进行初始化,必须用一个公有成员函数来进行同时这个函数应该有且僅在定义对象时自动执行一次,这时
调用的函数称为构造函数(constructor)
构造函数是特殊的成员函数,其特征如下:
a. 函数名与类名相同
d. 构造函数可以重载。
e.构造函数可以在类中定义也可以在类外定义。
f.如果类定义中没有给出构造函数则C++编译器自动产生一个缺省的构造函数,但只要我们定义了一个构造函数系统就不会自动 生成缺省的构造函数。
创建对象时使用同类对象来进行初始化这时所用的构造函数稱为拷贝构造函数(Copy Constructor),拷贝构造函数是特殊的构造函数
a. 拷贝构造函数其实是一个构造函数的重载。
b. 拷贝构造函数的参数必须使用引用傳参使用传值方式会引发无穷递归调用。(思考为什么)
c. 若未显示定义,系统会默认缺省的拷贝构造函数缺省的拷贝构造函数会,依次拷贝类成员进行初始化
赋值运算符的重载是对一个已存在的对象进行拷贝赋值。
g. 无参的构造函数和全缺省值的构造函数都认为是缺渻构造函数并且缺省的构造函数只能有一个。
(3) 赋值运算符重载
拷贝构造函数是创建的对象使用一个已有对象来初始化这个准备创建的對象。
当一个对象的生命周期结束时C++编译系统会自动调用一个成员函数,这个特殊的成员函数即析构函数(destructor)
构造函数是特殊的成员函數其特征如下:
a. 析构函数在类名加上字符~。
b. 析构函数无参数无返回值
c. 一个类有且只有一个析构函数。若未显示定义系统会自动生成缺省的析构函数。
d. 对象生命周期结束时C++编译系统系统自动调用析构函数。
e. 注意析构函数体内并不是删除对象而是做一些清理工作。
下面来看一个题来理解一下这个优化的问题
// Test1中调用了_2__次AA的拷贝构造函数,_1__次AA的赋值运算符函数的重载。
// Test2中调用了_2__次AA的拷贝构造函数,__0_次AA的赋值运算符函数的重载
// Test3中调用了__3_次AA的拷贝构造函数,__0_次AA的赋值运算符函数的重载。
下面就来分析一下为什么会是这个答案