1、为什么要有构造函数?
- 构造函数执行必要的初始化工作,有了构造函数,就不必专门再写初始化函数,也不用担心忘记调用初始化函数。
- 有时对象没被初始化就使用,会导致程序出错。
2、构造函数的作用
- 对对象进行初始化,如给成员变量赋初值。只要有对象生成,就一定会有构造函数被调用。
注意:构造函数并不负责构造一个对象,而是对编译器构造好的对象进行初始化。
3、构造函数的特点
- 名字与类名相同,可以有参数,不能有返回值(void也不行)。
- 如果定义类时没写构造函数,则编译器生成一个默认的无参数 的构造函数。
- 如果定义了构造函数,则编译器不生成默认的无参数的构造函数。
- 可以重载。也就是允许有多个构造函数,只要参数列表不同。
- 最好是public的。 private构造函数不能直接用来初始化对象。
4、构造函数起作用用的时机
- 对象生成时构造函数自动被调用。
- 对象一旦生成,就再也不能在其上执行构造函数。
5、默认构造函数
- 默认构造函数又叫无参构造函数。它是指,你编写了一个类,没有显式的为这个类写一个构造函数的话,编译器会自动的帮你写一个构造函数。
- 一个类中不一定有默认构造函数,只要你自己写了构造函数,就不再有默认构造函数。
6、构造函数与对象数组、指针数组
//例1
class CSample {
int x;
public:
//构造函数(1)
CSample() {
cout << "Constructor 1 Called" << endl;
}
//构造函数(2)
CSample(int n) {
x = n;
cout << "Constructor 2 Called" << endl;
}
};
int main(){
CSample array1[2]; //创建了两个对象,没有传递任何参数
cout << "step1"<<endl;
CSample array2[2] = {4,5}; //创建了两个对象,向第一个对象传递参数4,向第二个对象传递参数5
cout << "step2"<<endl;
CSample array3[2] = {3}; //创建了两个对象,向第一个对象传递参数3,没有向第二个对象传递参数
cout << "step3"<<endl;
CSample * array4 = new CSample[2]; // 在动态内存中创建了一个对象数组,在其中创建了两个对象,使用指针array4指向了这个对象数组
delete []array4;
return 0;
}
输出:
Constructor 1 Called
Constructor 1 Called
step1
Constructor 2 Called
Constructor 2 Called
step2
Constructor 2 Called
Constructor 1 Called
step3
Constructor 1 Called
Constructor 1 Called
//例2:
class Test {
public:
Test( int n) { } //构造函数(1)
Test( int n, int m) { } //构造函数(2)
Test() { } //构造函数(3)
};
Test array1[3] = { 1, Test(1,2) };// 构造了3个对象,三个对象分别用(1),(2),(3)初始化
Test array2[3] = { Test(2,3), Test(1,2) , 1};//构造了3个对象, 三个对象分别用(2),(2),(1)初始化
Test * pArray[3] = { new Test(4), new Test(1,2) };//创建了3个指针变量,其中前两个指针分别指向了在动态内存中的创建的两个Test对象,并且这两个对象时未命名的