1. 程式人生 > >【C++】利用建構函式對類物件進行初始化

【C++】利用建構函式對類物件進行初始化

一、物件的初始化

每一個物件都應當在它建立之時就有就有確定的內容,否則就會失去物件的意義。

class Time
{
	int hour = 0;
	int min = 0;
	int sec = 0;
};

這種是錯誤的,類並不是一個實體,並不佔儲存空間,顯然無處容納資料。

如果一個類是公用的,可以在定義物件時對資料成員進行初始化。

class Time
{
public:
	int hour;
	int min;
	int sec;
};
Time t1 = { 13,23,45 };

二、用建構函式實現對資料成員的初始化

C++提供建構函式來處理物件的初始化。建構函式是一種特殊的成員函式,與其它成員函式不同,不需要使用者來呼叫它,而是在建立物件時自動執行。

建構函式的名字必須與類名同名,以便編譯系統能識別它並把它作為建構函式處理。它不具有任何型別,不返回任何值。

#include <iostream>
using namespace std;
class Array
{
public:
	Array()
	{
		n = 100;
		for (int i = 0; i <= 99; i++)
		{
			a[i] = i+10;
		}
	}
	void set_value();
	void show_value();
private:
	int a[100];
	int n;
};
void Array::set_value()
{
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
}
void Array::show_value()
{
	for (int i = 0; i < n; i++)
	{
		cout << a[i] << " ";
	}
	cout << endl;
}
int main()
{
	Array arr;
	arr.set_value();
	arr.show_value();
	Array ar1;
	ar1.show_value();
	return 0;
}

下面的10-109是建構函式對物件的初始化。

上面是在類內定義建構函式的,也可以只在類內對建構函式進行宣告而在類外定義建構函式。

Array_sort::Array_sort()
{
	n = 100;
	for (int i = 0; i <= 99; i++)
	{
		a[i] = i + 10;
	}
}

注意:

1、建構函式沒有返回值,因此也沒有型別。

2、建構函式不需要使用者呼叫,也不能被使用者呼叫。

3、可以用一個類物件初始化另一個類物件。

Time t1;
Time t2=t1;

4、如果使用者自己沒有定義建構函式,則C++系統會自動生成一個建構函式,只是這個建構函式的函式體是空的,也沒有引數,不執行初始化操作。

三、帶引數的建構函式

可以採用帶引數的建構函式,在呼叫不同物件的建構函式時,從外面將不同的資料傳遞給建構函式,以實現不同的初始化。

建構函式首部的一般形式為:

建構函式名(型別1 形參1,型別2 形參2 ,......)

實參是在定義物件時給出的。

類名 物件名(實參1,實參2,......)

#include<iostream>
using namespace std;
class box
{
public :
	box(int, int, int);
	int volume();
private:
	int height;
	int width;
	int length;
};
box::box(int h, int w, int l)
{
	height = h;
	width = w;
	length = l;
}
int box::volume()
{
	return (height*width*length);
}
int main()
{
	box box1(12, 25, 30);
	cout << "The volume of box1 is " << box1.volume()<<endl;
	box box2(15, 30, 21);
	cout << "The volume of box2 is " << box2.volume() << endl;
	return 0;
}

四、使用引數初始化表對引數進行初始化

這種方法不再函式體內對資料成員初始化,而是在函式首部實現。

帶有引數初始化表的建構函式的一般形式如下:

類名::建構函式名([引數表])[:成員初始化表]

{

         [建構函式體]

}

方括號內為可選項(可有可無)。如果資料成員是陣列,則應當在建構函式的函式體中用語句對其賦值。

box::box(int h, int w, int l) :height(h), width(w), length(l) {}

 或者是在類裡面:

class box
{
public :
	box(int h, int w, int l) :height(h), width(w), length(l) {}
	int volume();
private:
	int height;
	int width;
	int length;
};
#include<iostream>
using namespace std;
class box
{
public :
	box(int , int , int );
	int volume();
private:
	int height;
	int width;
	int length;
};
box::box(int h, int w, int l) :height(h), width(w), length(l) {}
int box::volume()
{
	return (height*width*length);
}
int main()
{
	box box1(12, 25, 30);
	cout << "The volume of box1 is " << box1.volume()<<endl;
	box box2(15, 30, 21);
	cout << "The volume of box2 is " << box2.volume() << endl;
	return 0;
}

五、建構函式的過載

在一個類中可以定義多個建構函式,以便為物件提供不同的初始化方法。這些建構函式有相同的名字,但是引數的個數和型別不同。這成為建構函式的過載。

在建立物件時不必給出實參的建構函式,成為預設建構函式。顯然,無參建構函式屬於預設建構函式。

改變在:6-7行,14-19行

#include<iostream>
using namespace std;
class box
{
public :
	box();
	box(int h, int w, int l) :height(h), width(w), length(l) {}
	int volume();
private:
	int height;
	int width;
	int length;
};
box::box()
{
	height = 10;
	width = 10;
	length = 10;
}
int box::volume()
{
	return (height*width*length);
}
int main()
{
	box box1;
	cout << "The volume of box1 is " << box1.volume()<<endl;
	box box2(15, 30, 21);
	cout << "The volume of box2 is " << box2.volume() << endl;
	return 0;
}

六、使用預設引數的建構函式

建構函式中的引數的值既可以通過實參傳遞,也可以指定為預設的值,即如果使用者不指定實參值,編譯系統就使用形參去預設值。

#include<iostream>
using namespace std;
class box
{
public :
	box(int h=10, int w=10, int l=10);
	int volume();
private:
	int height;
	int width;
	int length;
};
box::box(int h,int w,int l)
{
	height = h;
	width = w;
	length = l;
}
int box::volume()
{
	return (height*width*length);
}
int main()
{
	box box1;
	cout << "The volume of box1 is " << box1.volume()<<endl;
	box box2(15);
	cout << "The volume of box2 is " << box2.volume() << endl;
	box box3(15,30);
	cout << "The volume of box3 is " << box3.volume() << endl;
	box box4(15,30,20);
	cout << "The volume of box4 is " << box4.volume() << endl;
	return 0;
}

說明:

1、在第6行的宣告建構函式時,形參名可以省略

box(int =10, int =10, int =10);

2、一個類只能有一個預設建構函式,也就是說,可以不用引數而呼叫建構函式,一個類只能有一個。

box();
box(int =10, int =10, int =10);
//“box::box”: 對過載函式的呼叫不明確

3、在一個類中定義了全部是預設引數的建構函式,不能再定義過載的建構函式。