類中成員函式的實現,放在類塊裡和外部實現的區別

2021-07-11 18:41:36 字數 3494 閱讀 5622

class weapon //兵器類

display object;

inline void display::output(void)

2.在類宣告的內部定義,叫做隱式內聯函式,如:

class display

} 引入內聯函式的目的是為了解決程式中函式呼叫的效率問題。 

函式是一種更高階的抽象。它的引入使得程式設計者只關心函式的功能和使用方法,而不必關心函式功能的具體實現;函式的引入可以減少程式的目標**,實現程式**和資料的共享。但是,函式呼叫也會帶來降低效率的問題,因為呼叫函式實際上將程式執行順序轉移到函式所存放在記憶體中某個位址,將函式的程式內容執行完後,再返回到轉去執行該函式前的地方。這種轉移操作要求在轉去前要保護現場並記憶執行的位址,轉回後先要恢復現場,並按原來儲存位址繼續執行。因此,函式呼叫要有一定的時間和空間方面的開銷,於是將影響其效率。特別是對於一些函式體**不是很大,但又頻繁地被呼叫的函式來講,解決其效率問題更為重要。引入內聯函式實際上就是為了解決這一問題。 

在程式編譯時,編譯器將程式中出現的內聯函式的呼叫表示式用內聯函式的函式體來進行替換。顯然,這種做法不會產生轉去轉回的問題,但是由於在編譯時將函式體中的**被替代到程式中,因此會增加目標程式**量,進而增加空間開銷,而在時間代銷上不象函式呼叫時那麼大,可見它是以目標**的增加為代價來換取時間的節省。 

在程式中,呼叫其函式時,該函式在編譯時被替代,而不是像一般函式那樣是在執行時被呼叫。 

使用內聯函式應注意的事項 

內聯函式具有一般函式的特性,它與一般函式所不同之處只在於函式呼叫的處理。一般函式進行呼叫時,要將程式執行權轉到被呼叫函式中,然後再返回到呼叫它的函式中;而內聯函式在呼叫時,是將呼叫表示式用內聯函式體來替換。在使用內聯函式時,應注意如下幾點: 

1.在內聯函式內不允許用迴圈語句和開關語句。 

如果內聯函式有這些語句,則編譯將該函式視同普通函式那樣產生函式呼叫**,遞迴函式(自己呼叫自己的函式)是不能被用來做內聯函式的。內聯函式只適合於只有1~5行的小函式。對乙個含有許多語句的大函式,函式呼叫和返回的開銷相對來說微不足道,所以也沒有必要用內聯函式實現。

2.內聯函式的定義必須出現在內聯函式第一次被呼叫之前。 

3.本欄目講到的類結構中所有在類說明內部定義的函式是內聯函式。

類的成員函式(簡稱類函式)是函式的一種,它的用法和作用和前面介紹過的函式基本上是一樣的,它也有返回值和函式型別,它與一般函式的區別只是:它是屬於乙個類的成員,出現在類體中。它可以被指定為private(私有的)、public (公用的)或protected(受保護的)。

在使用類函式時,要注意呼叫它的許可權(它能否被呼叫)以及它的作用域(函式能使用什麼範圍中的資料和函式)。例如私有的成員函式只能被本類中的其它成員函式所呼叫,而不能被類外呼叫。成員函式可以訪問本類中任何成員(包括私有的和公用的),可以引用在本作用域中有效的資料。

一般的做法是將需要被外界呼叫的成員函式指定為public,它們是類的對外介面。

但應注意,並非要求把所有成員函式都指定為public。有的函式並不是準備為外界呼叫的,而是為本類中的成員函式所呼叫的,就應該將它們指定為private。這種函式的作用是支援其它函式的操作,是類中其它成員的工具函式(utility function),類外使用者不能呼叫這些私有的工具函式。

類的成員函式是類體中十分重要的部分。如果乙個類中不包含成員函式,就等同於c語言中的結構體了,體現不出類在物件導向程式設計中的作用。

在前面已經看到成員函式是在類體中定義的。也可以在類體中只寫成員函式的宣告,而在類的外面進行函式定義。如:

class student

;void student::display(

)//在類外定義display類函式

student stud1,stud2;

//定義兩個類物件

注意:在類體中直接定義函式時,不需要在函式名前面加上類名,因為函式屬於哪乙個類是不言而喻的。

但成員函式在類外定義時,必須在函式名前面加上類名,予以限定(qualifed)," :: "是

作用域限定符(field qualifier)

或稱作用域運算子

,用它宣告函式是屬於哪個類的。

如果在作用域運算子「::」的前面沒有類名,或者函式名前面既無類名又無作用域運算子「::」,如

::display( ) 或 display( )

則表示display函式不屬於任何類,這個函式不是成員函式,而是全域性函式,即非成員函式的一般普通函式。

類函式必須先在類體中作原型宣告,然後在類外定義,也就是說類體的位置應在函式定義之前,否則編譯時會出錯。

雖然函式在類的外部定義,但在呼叫成員函式時會根據在類中宣告的函式原型找到函式的定義(函式**),從而執行該函式。

在類的內部對成員函式作宣告,而在類體外定義成員函式,這是程式設計的一種良好習慣。如果乙個函式,其函式體只有2-3行,一般可在宣告類時在類體中定義。多於3行的函式,一般在類體內宣告,在類外定義。

關於內建(inline )函式,在前邊已經作過介紹,請猛擊:

c++內建函式

。類的成員函式也可以指定為內建函式。

在類體中定義的成員函式的規模一般都很小,而系統呼叫函式的過程所花費的時間開銷相對是比較大的。呼叫乙個函式的時間開銷遠遠大於小規模函式體中全部語句的執行時間。為了減少時間開銷,如果在類體中定義的成員函式中不包括迴圈等控制結構,c++系統會自動將它們作為內建(inline)函式來處理。

也就是說,在程式呼叫這些成員函式時,並不是真正地執行函式的呼叫過程(如保留返回位址等處理),而是把函式**嵌入程式的呼叫點。這樣可以大大減少呼叫成員函式的時間開銷。c++要求對一般的內建函式要用關鍵字inline宣告,但對類內定義的成員函式,可以省略inline,因為這些成員函式已被隱含地指定為內建函式。如:

class student

private

:int num;

string name;

char ***;};

其中第3行

void display( )

也可以寫成

inline void display( )

將display函式顯式地宣告為內建函式。

以上兩種寫法是等效的。對在類體內定義的函式,一般都省寫inline。

應該注意的是,如果成員函式不在類體內定義,而在類體外定義,系統並不把它預設為內建(inline )函式,呼叫這些成員函式的過程和呼叫一般函式的過程是相同的。如果想將這些成員函式指定為內建函式,應當用inline作顯式宣告。

如:class student

;inline

void student::display(

)// 在類外定義display函式為內建函式

在前面曾提到過,在函式的宣告或函式的定義兩者之一作inline宣告即可。值得注意的是,如果在類體外定義inline函式,則必須將類定義和成員函式的定義都放在同乙個標頭檔案中(或者寫在同乙個原始檔中),否則編譯時無法進行置換(將函式**的拷貝嵌入到函式呼叫點)。但是這樣做,不利於類的介面與類的實現分離,不利於資訊隱蔽。雖然程式的執行效率提高了,但從軟體工程質量的角度來看,這樣做並不是好的辦法。只有在類外定義的成員函式規模很小而呼叫頻率較高時,才將此成員函式指定為內建函式

類中成員函式的實現,放在類塊裡和外部實現的區別

class weapon 兵器類 display object inline void display output void 2.在類宣告的內部定義,叫做隱式內聯函式,如 class display 引入內聯函式的目的是為了解決程式中函式呼叫的效率問題。函式是一種更高階的抽象。它的引入使得程式設計...

const 只能放在類成員函式的後面

const用在成員函式後 主要是針對類的const 物件 class text void print void print const private int r1,r2 void r print int const a func int a func const 上面的 是合法的,其中a func...

類中宣告的函式和類的成員函式

define crt secure no warnings include using namespace std class a void a f1 void f int main 在類內宣告的函式未必是類的成員函式,也許只是宣告一下,告訴編譯器,我有這個函式。編譯器說,好,我知道了。但是實現f ...