C++淺析構(gòu)造函數(shù)的特性
構(gòu)造函數(shù)的概念
構(gòu)造函數(shù)是一個(gè)特殊的成員函數(shù),名字與類名相同,創(chuàng)建類類型對(duì)象時(shí)由編譯器自動(dòng)調(diào)用,保證每個(gè)數(shù)據(jù)成員都有一個(gè)合適的初始值,并且在對(duì)象的生命周期內(nèi)只調(diào)用一次。
構(gòu)造函數(shù)的特性
(1)函數(shù)名與類名相同。
(2)無(wú)返回值。
(3)編譯器自動(dòng)調(diào)用對(duì)應(yīng)的構(gòu)造函數(shù)。
(4)構(gòu)造函數(shù)可以重載。
我們這里直接舉一個(gè)例子
#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; }
于是得到的的結(jié)果為:
只能有一個(gè)構(gòu)造函數(shù)
無(wú)參的構(gòu)造函數(shù)和全缺省的構(gòu)造函數(shù)都稱為默認(rèn)構(gòu)造函數(shù),并且默認(rèn)構(gòu)造函數(shù)只能有一個(gè)。
下面舉一個(gè)錯(cuò)誤案例:
#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; }
上面的代碼中,有兩個(gè)默認(rèn)的構(gòu)造函數(shù),因?yàn)椴粠?shù)的構(gòu)造函數(shù)和全缺省的構(gòu)造函數(shù)都被看為默認(rèn)的構(gòu)造函數(shù),所以說(shuō),現(xiàn)在有兩個(gè)構(gòu)造函數(shù),編譯器不知道到底要去調(diào)用哪個(gè)構(gòu)造函數(shù),所以說(shuō),就會(huì)報(bào)錯(cuò),所以我們刪除一個(gè)就可以了。
關(guān)于編譯器生成的默認(rèn)成員函數(shù),很多人會(huì)有疑惑:在我們不實(shí)現(xiàn)構(gòu)造函數(shù)的情況下,編譯器會(huì)生成默認(rèn)的構(gòu)造函數(shù)。但是看起來(lái)默認(rèn)構(gòu)造函數(shù)又沒(méi)什么用?對(duì)象調(diào)用了編譯器生成的默認(rèn)構(gòu)造函數(shù),但是對(duì)象year/month/_day,依舊是隨機(jī)值。也就說(shuō)在這里編譯器生成的默認(rèn)構(gòu)造函數(shù)并沒(méi)有什么用?
解答:C++把類型分成內(nèi)置類型(基本類型)和自定義類型。內(nèi)置類型就是語(yǔ)法已經(jīng)定義好的類型:如int/char...,自定義類型就是我們使用class/struct/union自己定義的類型,看看下面的程序,就發(fā)發(fā)現(xiàn)編譯器生成默認(rèn)的構(gòu)造函數(shù)會(huì)對(duì)自定類型成員_t調(diào)用的它的默認(rèn)成員函數(shù)
class Time { public: Time() { cout << "Time()" << endl; _hour = 0; _minute = 0; _second = 0; } private: int _hour; int _minute; int _second; }; class Date { private: // 基本類型(內(nèi)置類型) int _year; int _month; int _day; // 自定義類型 Time _t; }; int main() { Date d; return 0; }
什么意思呢,就是編譯器會(huì)不管int,char這種基本類型,而會(huì)去管自定義類型
這是輸出的結(jié)果
到此這篇關(guān)于C++淺析構(gòu)造函數(shù)的特性的文章就介紹到這了,更多相關(guān)C++構(gòu)造函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺析C++?atomic?和?memory?ordering
這篇文章主要介紹了C++?atomic?和?memory?ordering的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易的掃雷游戲
這篇文章主要為大家詳細(xì)介紹了基于C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易的掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06C++中的結(jié)構(gòu)體vector排序問(wèn)題
這篇文章主要介紹了C++中的結(jié)構(gòu)體vector排序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11