有這么一段代碼,
創(chuàng)新互聯(lián)公司自2013年起,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站設(shè)計、做網(wǎng)站網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元臨汾做網(wǎng)站,已為上家服務(wù),為臨汾各地企業(yè)和個人服務(wù),聯(lián)系電話:18982081108
class Person{ private: char* name; char age; public: void SetName ( char* name ){ this->name = name; } int SetAge ( char age ){ this->age = age; return 1; } }; Person person; person.SetName ( "chentong" ); person.SetAge ( 20 );
我想要初始化成員變量,那么我就得每次通過類變量調(diào)用成員函數(shù)來實現(xiàn),這樣做當然可以,不過比較麻煩,為了解決這個麻煩,C++引入了構(gòu)造函數(shù)這樣一個概念。什么是構(gòu)造函數(shù)?與類名相同的函數(shù),叫做構(gòu)造函數(shù)。構(gòu)造函數(shù)可以有多個,如何區(qū)分?通過參數(shù)列表的不同來區(qū)分。若是我們沒有自己寫構(gòu)造函數(shù),那么,系統(tǒng)會自動調(diào)用默認構(gòu)造函數(shù)。但是,如果我們自己實現(xiàn)了構(gòu)造函數(shù),系統(tǒng)就不會再調(diào)用默認構(gòu)造函數(shù)了。代碼如下,
class Person{ private: char* name; char age; public: void SetName ( char* name ){ this->name = name; } int SetAge ( char age ){ this->age = age; return 1; } void Person () { } void Person ( char* name, char age ){ this->name = name; this->age = age; } };
那么我們想要初始化變量,只要,
Person person ( "chentong", 20 );
這樣,只要調(diào)用一次構(gòu)造函數(shù)就對所有成員進行了設(shè)置。
那么,調(diào)用不帶參數(shù)的構(gòu)造函數(shù),如下:
Person person1;
這樣就是調(diào)用了不帶參數(shù)的構(gòu)造函數(shù)而不能寫成這樣,
Person person1();
因為,這樣寫的意義是,聲明一個函數(shù)。因為,這樣寫,就相當于,int fac(); //函數(shù)的聲明。順帶說一句,自己重寫構(gòu)造函數(shù)后,一定要寫一個不帶參數(shù)的構(gòu)造函數(shù),否則編譯無法通過。
通過指針訪問
Person* person1 = new Person; Person* person2 = new Person(); //Person1和Person2的作用完全一樣,都會調(diào)用無參構(gòu)造函數(shù) Person* person3 = new Person [2]; Person* person4 = new Person ( "chentong", 20 );
釋放內(nèi)存
delete person1; delete person2; delete []person3; delete person4;
有如下代碼:
class Person{ private: char* name; char age; char* job; public: void SetName ( char* name ){ this->name = name; } int SetAge ( char age ){ this->age = age; return 1; } void SetJob ( char* job ){ this->job = job; } void Person(){ } void Person( char* name, char age, char* job ){ this->name = new char[strlen(name)+1]; strcpy ( this->name, name ); this->age = age; this->job = new char[stlren(job) + 1]; strcpy ( this->job, job ); } void Person ( char* name, char age, char* job = "none" ){ //this->name = name; this->name = new char[strlen[name + 1]; strcpy ( this->name, name ); this->age = age; //this->job = job; this->job = new char[strlen[name + 1]; strcpy ( this->job, job ); } };
這段代碼通過new動態(tài)申請空間,來存放數(shù)據(jù)。C++中,new用來動態(tài)申請空間,delete用來釋放動態(tài)申請的空間。那么C中的malloc()和C++中的new有什么區(qū)別呢?它們都能用來動態(tài)的申請空間,malloc申請的空間,如果不去主動釋放,那么被申請的空間將一直不會釋放,這樣就會造成內(nèi)存的浪費。而new動態(tài)申請的空間,在程序執(zhí)行時不會釋放,直到程序執(zhí)行完畢,動態(tài)申請的空間才會被釋放。如果想要在空間使用完畢后就釋放,只要通過delete就可以做到了。
很明顯,我們可以把釋放空間的代碼寫成一個函數(shù),當空間使用完畢后,直接調(diào)用釋放函數(shù),空間就可以被釋放了。如果動態(tài)申請的空間比較多,可能會出現(xiàn)遺漏釋放的情況,所以,為了避免這種情況出現(xiàn),C++引入了析構(gòu)函數(shù)這樣一個概念。當動態(tài)空間使用完畢后,析構(gòu)函數(shù)會自動別調(diào)用,這樣以來,空間就被釋放了。析構(gòu)函數(shù)和構(gòu)造函數(shù)類似,都是與類名相同,只不過是,在類名之前加了一個波浪線~。順帶一提,構(gòu)造函數(shù)和析構(gòu)函數(shù)都沒有返回值類型。代碼如下:
class People { private: char* name; char age; char* job; public: void SetName(char* name) { this->name = new char[strlen(name) + 1]; strcpy(this->name, name); } int SetAge(char age) { if (age > 150 || age < 0) { age = 0; return -1; } this->age = age; } void SetJob(char* job) { this->job = new char[strlen(job) + 1]; strcpy(this->job, job); } void PrintInfo() { cout << "name = " << this->name << ", age = " << this->age << ", job = " << this->job << endl; } People() { this->name = NULL; this->job = NULL; } People(char* name, char age, char* job) { this->name = new char[strlen(name) + 1]; strcpy(this->name, name); this->age = age; this->job = new char[strlen(job) + 1]; strcpy(this->job, job); } ~People() { if (this->name != NULL) delete this->name; if (this->job != NULL) delete this->job; } };
這里的~People()就是析構(gòu)函數(shù)。當程序執(zhí)行完畢后,析構(gòu)函數(shù)會自動被調(diào)用。動態(tài)申請的空間就被釋放了。