2 回答

TA貢獻(xiàn)1811條經(jīng)驗 獲得超5個贊
Book(){} //這一行為什么要用?似乎去掉對程序也沒有影響,是為什么?——定義一個無參(默認(rèn))構(gòu)造函數(shù),如果去掉,就不能創(chuàng)建沒有初始值的對象了。比如,Book b; 就會出錯。
Book(const char* str1,const char*str2,const int num)//這個以下的是函數(shù)嗎?非得用Book這個名嗎?——這是(有參)構(gòu)造函數(shù),構(gòu)造函數(shù)的名字必須與類名相同,所以必須用Book。
void setbook(const char *str1,const char *str2,const int num)/*這是什么,怎么它的大括弧里給上面的一樣呢?好像去掉也沒有關(guān)系,程序也是對的。*/——這是設(shè)置類數(shù)據(jù)成員值的函數(shù),其函數(shù)體一般都與有參構(gòu)造函數(shù)相同。如果去掉這個函數(shù),則所創(chuàng)建的對象就無法改變其成員的值了。
//這個析構(gòu)函數(shù)好像去掉也可以的唉。為什么?——如果沒有這個析構(gòu)函數(shù),雖然運(yùn)行不報錯,但是在對象被釋放時對象所占據(jù)的內(nèi)存不能被釋放,造成內(nèi)存泄漏。

TA貢獻(xiàn)1804條經(jīng)驗 獲得超8個贊
學(xué)習(xí)過程要循序漸進(jìn),如果問題集中出現(xiàn),先一個問題一個問題去弄懂去測試,其他暫時忽略。
重點(diǎn):new、delete兩個關(guān)鍵詞多了解下其作用。
例子中是一個Book類,而以類名作為函數(shù)的叫做構(gòu)造函數(shù),構(gòu)造函數(shù)只在對象創(chuàng)建時由系統(tǒng)調(diào)用,用于初始化對象內(nèi)部的成員變量(如果需要)。下面一個個解答。
1、Book(){}
函數(shù)接口中沒有定義參數(shù)的,叫做無參構(gòu)造函數(shù),也叫默認(rèn)構(gòu)造函數(shù),之所以叫默認(rèn)構(gòu)造函數(shù),因為如果你去掉或沒有定義,系統(tǒng)會自動提供一個無參構(gòu)造函數(shù),什么也不會做,只是為了統(tǒng)一接口規(guī)范或標(biāo)準(zhǔn)。當(dāng)然你也可以在默認(rèn)構(gòu)造函數(shù)體內(nèi)(大括號中)編寫初始化代碼。一般來說,無參構(gòu)造函數(shù)所初始化的值是可以事先確定的。
2、Book(const char* str1,const char*str2,const int num)
該函數(shù)與類名同名,因此也是構(gòu)造函數(shù),區(qū)別在于這個函數(shù)是帶參數(shù)的,所以叫有參構(gòu)造函數(shù)。如果外部程序創(chuàng)建Book對象時需要使用一些外部(相對于對象內(nèi)部)值去初始化對象內(nèi)部的變量,就可以采用該函數(shù)創(chuàng)建對象。
比如:
//假設(shè)pstr1和pstr2是2個字符串指針
Book *pbook=new Book(pstr1,pstr2,100);
創(chuàng)建對象時就會調(diào)用該函數(shù),將外部程序的2個字符串指針和一個整數(shù)常量傳遞給函數(shù),用于初始化。
3、void setbook(const char *str1,const char *str2,const int num)/
這是普通函數(shù),作用和2中所述的構(gòu)造函數(shù)一樣,你可以發(fā)現(xiàn)參數(shù)和代碼都相同,都是用于初始化變量的。區(qū)別在于普通函數(shù)只有在對象創(chuàng)建之后顯式調(diào)用。
比如
Book *pBook=new Book();//采用默認(rèn)構(gòu)造函數(shù)創(chuàng)建對象,也就是不進(jìn)行初始化
pBook->setbook(pstr1,pstr2,100);//對象創(chuàng)建后,再顯式調(diào)用setbook函數(shù)進(jìn)行初始化對象成員的工作。
如此,Book類提供了兩種初始化變量的途徑,這樣外部程序可以根據(jù)需要靈活選擇,前者,創(chuàng)建對象前數(shù)據(jù)已確定時采用,后者,創(chuàng)建對象時數(shù)據(jù)不確定采用。
例子中,由于主函數(shù)main沒有采用后者去調(diào)用setbook函數(shù),所以去掉也不會受影響。
4、~Book()
在類名前面加個~號的函數(shù)叫析構(gòu)函數(shù),該函數(shù)僅在對象被釋放的時候被執(zhí)行,用于釋放對象內(nèi)部動態(tài)分配的內(nèi)存,防止內(nèi)存泄漏。此例中,析構(gòu)函數(shù)釋放了title和author兩個指針指向的內(nèi)存塊。注意前面的delete關(guān)鍵詞,該關(guān)鍵詞用于釋放指針指向的內(nèi)存塊。而這兩個變量是char *類型,就是字符指針類型。同時注意構(gòu)造函數(shù)中這兩個指針都被指向了新建的內(nèi)存塊的地址。
title=new char[len+1];
author=new char[len+1];
去掉沒有問題是因為這個程序簡單,輸出完程序就結(jié)束了,系統(tǒng)會在程序結(jié)束時自動釋放所有動態(tài)分配的內(nèi)存空間,但是如果程序復(fù)雜的話就會出現(xiàn)問題。
5、Book obj1("數(shù)據(jù)結(jié)構(gòu)","嚴(yán)蔚敏",200);
此語句意思為創(chuàng)建一個obj1的對象,并以括號內(nèi)的參數(shù)進(jìn)行初始化,也就是調(diào)用了有參構(gòu)造函數(shù)。
創(chuàng)建對象有兩種方法(以調(diào)用默認(rèn)構(gòu)造函數(shù)舉例):
一是靜態(tài)創(chuàng)建,對象被分配在棧上,不返回指針,使用對象名作為別名,以映射內(nèi)存地址。
Book obj1;
二是動態(tài)創(chuàng)建對象,對象被分配在堆上,返回的是指針。
Book * p1=new Book();
最后,凡是通過new的對象都需要delete釋放內(nèi)存空間。
添加回答
舉報