1、C++的构造函数

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对象,并且这两个对象时未命名的

posted @ 2019-11-24 16:37  江南又一春  阅读(140)  评论(0编辑  收藏  举报