C++淺析構造函數的特性

構造函數的概念

構造函數是一個特殊的成員函數,名字與類名相同,創建類類型對象時由編譯器自動調用,保證每個數據成員都有一個合適的初始值,並且在對象的生命周期內隻調用一次。

構造函數的特性

(1)函數名與類名相同。

(2)無返回值。

(3)編譯器自動調用對應的構造函數。

(4)構造函數可以重載。

我們這裡直接舉一個例子

#include<iostream>
using namespace std;
class Data
{
public:
	Data()
	{
		cout << "Date()" << this << endl;
	}
	void InitData(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void PrintfData()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Data d1,d2;
	d1.InitData(2022,5,21);
	d1.PrintfData();
	return 0;
}

於是得到的的結果為:

隻能有一個構造函數

無參的構造函數和全缺省的構造函數都稱為默認構造函數,並且默認構造函數隻能有一個。

下面舉一個錯誤案例:

#include<iostream>
using namespace std;
class Data
{
public:
	Data()
	{
		cout << "Date()" << this << endl;
	}
Data()
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void InitData(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void PrintfData()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Data d1
	return 0;
}

上面的代碼中,有兩個默認的構造函數,因為不帶參數的構造函數和全缺省的構造函數都被看為默認的構造函數,所以說,現在有兩個構造函數,編譯器不知道到底要去調用哪個構造函數,所以說,就會報錯,所以我們刪除一個就可以瞭。

關於編譯器生成的默認成員函數,很多人會有疑惑:在我們不實現構造函數的情況下,編譯器會生成默認的構造函數。但是看起來默認構造函數又沒什麼用?對象調用瞭編譯器生成的默認構造函數,但是對象year/month/_day,依舊是隨機值。也就說在這裡編譯器生成的默認構造函數並沒有什麼用?

解答:C++把類型分成內置類型(基本類型)和自定義類型。內置類型就是語法已經定義好的類型:如int/char…,自定義類型就是我們使用class/struct/union自己定義的類型,看看下面的程序,就發發現編譯器生成默認的構造函數會對自定類型成員_t調用的它的默認成員函數

class Time
{
public:
	Time()
	{
		cout << "Time()" << endl;
		_hour = 0;
		_minute = 0;
		_second = 0;
	}
private:
	int _hour;
	int _minute;
	int _second;
};
class Date
{
private:
	// 基本類型(內置類型)
	int _year;
	int _month;
	int _day;
	// 自定義類型
	Time _t;
};
int main()
{
	Date d;
	return 0;
}

什麼意思呢,就是編譯器會不管int,char這種基本類型,而會去管自定義類型

這是輸出的結果

到此這篇關於C++淺析構造函數的特性的文章就介紹到這瞭,更多相關C++構造函數內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: