C++之構造函數

構造函數

構造函數是C++類用來初始化屬性成員的方式。一個類的構造函數名和類名一致,構造函數沒有返回值,也不能使用void來修飾。

當你沒顯式定義構造函數的時候,C++會給你一個默認構造函數,他什麼都不做。如果你定義了自己的構造函數,那麼將不在提供默認構造函數,這時候就需要你自己去定義一個無參數的構造函數。

構造函數可以被重載。

class A
{
public:
	A();
	A(int a, int b);
	void getValue(int& a, int& b);
private:
	int a;
	int b;
};
class B
{
public:
	B(int& m);
	void getValue(double& p, int &c);
private:
	A a;
	const double PI;
	int& b;
};

A::A()
{
	//nothing
}

A::A(int a, int b)
{
	this->a = a;
	this->b = b;
}

void A::getValue(int& a, int& b)
{
	a = this->a;
	b = this->b;
}


B::B(int& m) :a(1, 2), PI(3.14), b(m)
{

}

void B::getValue(double& p, int &c)
{
	p = this->PI;
	c = this->b;
}

B類的構造函數使用了初始化列表的方式。初始化列表就是在構造函數參數列表後加上:開始書寫。使用初始化列表是因爲:

1.對於類類型而言使用初始化列表少了一次調用拷貝構造函數的過程

2.引用類型如果是引用類外的變量那麼必須在此次初始化。

只有構造函數才能初始化列表。另外初始化列表的書寫的初始化順序是無關緊要的,因爲使用初始化列表時,初始化順序由定義變量的順序決定。初始化列表在構造函數的函數體之前執行。

據說使用初始化列表是初始化,而構造函數的函數體內執行的操作是賦值。前者的效率更高。

在main函數中做測試如下:


int main()
{
	A a(0,3);
	int m, n;
	double q;
	int d = 333;
	a.getValue(m, n);
	std::cout << "m:" << m << "   " << "n:" << n << std::endl;
	B b(d);
    b.getValue(q, &m);
	std::cout << "m:" << m << std::endl;
}

編譯運行都沒有問題。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章