一、构造函数
1. 构造函数:这个成员函数名必须和类名相同,定义时可以有参数,但是不可以有任何返回类型的声明。
2. 构造函数调用的三种方式
Test t1(4); //自动调用构造函数 Test t2 = 5; //自动调用构造函数 Test t3 = Test(6); //主动调用构造函数
3. 当类中已经写了构造函数了,C++将不再为类提供无参的空函数的默认构造函数。
4. 当类中没有定义拷贝构造函数时,编译器会默认提供一个拷贝构造函数,简单的进行成员变量值复制,浅拷贝。拷贝构造函数的参数是同类对象的const引用,语义是用参数对象的内容初始化当前对象。
Test(const Test &v) {......}
函数调用时,若类的对象做为参数或返回,会自动调用拷贝构造函数,用来完成对象值的传递。也就意味在在已有数值的基础上生成新的对象。当直接用一个对象去初始化另一个对象时,也会自动调用拷贝构造函数。
对象之间的赋值是通过拷贝构造函数实现的,类似于赋值符号"="重载,能赋值过去多少,取决于拷贝构造函数。
若是没有提供拷贝构造函数,C++提供的默认的拷贝构造函数会进行成员变量的全部一一拷贝,但不会做其它事情,比如申请内存。
注意: 使用一个对象去初始化另一个对象使用的是拷贝构造函数,例如 Array a2=a1; 对象间的赋值调用的是"="重载,例如 a2=a1;
5. 成员函数可以重载,构造函数也可以重载。
6. 可以在代码中直接调用构造,产生一个临时对象,又立即析构了。
7. 在类定义中成员变量是不允许被赋初值的,比如成员变量const int c; 若不在类中定义需要赋初值。
类的const成员会被分配空间的,本质是只读变量。因为编译时不知道其值是多少,因此不会进入符号表。const成员变量必须在初始化列表中进行初始化。
8. 构造函数的初始化列表,格式为: 类名::类名():m1(v1), m2(v1,v2), m3(v3) 其中”类名::类名()”是构造函数,分号后面是初始化列表,m1 m2 m3是(类)成员变量,v1 v2 v3是初始化值。
注意:成员变量的初始化顺序与声明的顺序相关,与在初始化列表中的顺序无关。初始化列表先于构造函数的函数体执行。
9. 构造函数的调用次序为: 当类中的成员变量是其它类的对象时,首先调用成员变量的构造函数,调用顺序与声明顺序相同,之后再调用类自身的构造函数。
析构函数的调用程序与对应的构造函数调用的次序相反。
10. 构造函数使用默认参数挺好
Test(int a = 0, int b = 0) { this->a = a; this->b = b; } //调用: Test t1; Test t1(1); Test t1(1, 2);
二、析构函数
1. 析构函数定义为 ~ClassName(),析构函数没有参数,没有任何返回类型的声明。析构函数只有一个,没有参数,因此不可重载。一个对象在销毁时自动调用析构函数。