詳解C++編程中的嵌套類(lèi)的聲明與其中的函數(shù)使用
可以在一個(gè)類(lèi)的范圍內(nèi)聲明另一個(gè)類(lèi)。這樣的類(lèi)稱(chēng)為“嵌套類(lèi)”。 嵌套類(lèi)被視為在封閉類(lèi)的范圍內(nèi)且可在該范圍內(nèi)使用。若要從嵌套類(lèi)的即時(shí)封閉范圍之外的某個(gè)范圍引用該類(lèi),則必須使用完全限定名。
下面的示例演示如何聲明嵌套類(lèi):
// nested_class_declarations.cpp class BufferedIO { public: enum IOError { None, Access, General }; // Declare nested class BufferedInput. class BufferedInput { public: int read(); int good() { return _inputerror == None; } private: IOError _inputerror; }; // Declare nested class BufferedOutput. class BufferedOutput { // Member list }; }; int main() { }
在 BufferedIO::BufferedInput 中聲明 BufferedIO::BufferedOutput 和 BufferedIO。這些類(lèi)名稱(chēng)在類(lèi) BufferedIO 的范圍外不可見(jiàn)。但是,BufferedIO 類(lèi)型的對(duì)象不包含 BufferedInput 或 BufferedOutput 類(lèi)型的任何對(duì)象。
嵌套類(lèi)只能從封閉類(lèi)中直接使用名稱(chēng)、類(lèi)型名稱(chēng),靜態(tài)成員的名稱(chēng)和枚舉數(shù)。若要使用其他類(lèi)成員的名稱(chēng),您必須使用指針、引用或?qū)ο竺?br />
在前面的 BufferedIO 示例中,枚舉 IOError 可由嵌套類(lèi)中的成員函數(shù)、BufferedIO::BufferedInput 或 BufferedIO::BufferedOutput 直接訪(fǎng)問(wèn),如函數(shù) good 中所示。
注意
嵌套類(lèi)僅在類(lèi)范圍內(nèi)聲明類(lèi)型。它們不會(huì)導(dǎo)致創(chuàng)建嵌套類(lèi)的包含對(duì)象。前面的示例聲明兩個(gè)嵌套類(lèi),但未聲明這些類(lèi)類(lèi)型的任何對(duì)象。
在將類(lèi)型名稱(chēng)與前向聲明一起聲明時(shí),會(huì)引發(fā)嵌套類(lèi)聲明的范圍可見(jiàn)性的異常。在這種情況下,由前向聲明聲明的類(lèi)名在封閉類(lèi)的外部可見(jiàn),其范圍定義為最小的封閉非類(lèi)范圍。例如:
// nested_class_declarations_2.cpp class C { public: typedef class U u_t; // class U visible outside class C scope typedef class V {} v_t; // class V not visible outside class C }; int main() { // okay, forward declaration used above so file scope is used U* pu; // error, type name only exists in class C scope u_t* pu2; // C2065 // error, class defined above so class C scope V* pv; // C2065 // okay, fully qualified name C::V* pv2; }
嵌套類(lèi)中的訪(fǎng)問(wèn)權(quán)限
將一個(gè)類(lèi)嵌入另一個(gè)類(lèi)中不會(huì)為嵌入類(lèi)的成員函數(shù)提供特殊訪(fǎng)問(wèn)權(quán)限。同樣,封閉類(lèi)的成員函數(shù)不具有對(duì)嵌套類(lèi)的成員的特殊訪(fǎng)問(wèn)權(quán)限。
嵌套類(lèi)中的成員函數(shù)
在嵌套類(lèi)中聲明的成員函數(shù)可在文件范圍中定義。前面的示例可能已編寫(xiě):
// member_functions_in_nested_classes.cpp class BufferedIO { public: enum IOError { None, Access, General }; class BufferedInput { public: int read(); // Declare but do not define member int good(); // functions read and good. private: IOError _inputerror; }; class BufferedOutput { // Member list. }; }; // Define member functions read and good in // file scope. int BufferedIO::BufferedInput::read() { return(1); } int BufferedIO::BufferedInput::good() { return _inputerror == None; } int main() { }
在前面的示例中,qualified-type-name 語(yǔ)法用于聲明函數(shù)名稱(chēng)。聲明:
BufferedIO::BufferedInput::read()
表示“作為 read 類(lèi)(位于 BufferedInput 類(lèi)的范圍中)的成員的 BufferedIO 函數(shù)?!?由于此聲明使用 qualified-type-name 語(yǔ)法,因此以下形式的構(gòu)造是可能的:
typedef BufferedIO::BufferedInput BIO_INPUT; int BIO_INPUT::read()
上述聲明與前一個(gè)聲明等效,但它使用了 typedef 名稱(chēng)來(lái)代替類(lèi)名稱(chēng)。
嵌套類(lèi)中的友元函數(shù)
嵌套類(lèi)中聲明的友元函數(shù)被認(rèn)為是在嵌套類(lèi)而不是封閉類(lèi)的范圍內(nèi)。因此,友元函數(shù)未獲得對(duì)封閉類(lèi)的成員或成員函數(shù)的特定訪(fǎng)問(wèn)權(quán)限。如果需要使用在友元函數(shù)中的嵌套類(lèi)中聲明的名稱(chēng),并且友元函數(shù)是在文件范圍內(nèi)定義的,請(qǐng)使用限定的類(lèi)型名稱(chēng),如下所示:
// friend_functions_and_nested_classes.cpp #include <string.h> enum { sizeOfMessage = 255 }; char *rgszMessage[sizeOfMessage]; class BufferedIO { public: class BufferedInput { public: friend int GetExtendedErrorStatus(); static char *message; static int messageSize; int iMsgNo; }; }; char *BufferedIO::BufferedInput::message; int BufferedIO::BufferedInput::messageSize; int GetExtendedErrorStatus() { int iMsgNo = 1; // assign arbitrary value as message number strcpy_s( BufferedIO::BufferedInput::message, BufferedIO::BufferedInput::messageSize, rgszMessage[iMsgNo] ); return iMsgNo; } int main() { }
以下代碼演示聲明為友元函數(shù)的函數(shù) GetExtendedErrorStatus。在文件范圍內(nèi)定義的函數(shù)中,將消息從靜態(tài)數(shù)組復(fù)制到類(lèi)成員中。請(qǐng)注意,GetExtendedErrorStatus 的更佳實(shí)現(xiàn)是將其聲明為:
int GetExtendedErrorStatus( char *message )
利用前面的接口,許多類(lèi)可以通過(guò)傳遞要復(fù)制錯(cuò)誤消息的內(nèi)存位置來(lái)使用此函數(shù)的服務(wù)。
相關(guān)文章
C/C++獲取Windows平臺(tái)CPU占用率的方法
最近在做系統(tǒng)信息相關(guān)的接口,為了實(shí)現(xiàn)跨平臺(tái),故在linux和Windows平臺(tái)獲取占用率信息,文章主要介紹Windows下的方法,文中給出了參考代碼,需要的朋友可以參考下2023-12-12C++中類(lèi)的轉(zhuǎn)換函數(shù)你了解嗎
這篇文章主要為大家詳細(xì)介紹了C++中類(lèi)的轉(zhuǎn)換函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03C語(yǔ)言中的強(qiáng)符號(hào)和弱符號(hào)介紹
這篇文章主要介紹了C語(yǔ)言中的強(qiáng)符號(hào)和弱符號(hào)介紹,本文用多個(gè)實(shí)例來(lái)講解強(qiáng)符號(hào)和弱符號(hào),需要的朋友可以參考下2015-03-03C語(yǔ)言詳細(xì)分析講解關(guān)鍵字const與volatile的用法
在C語(yǔ)言中,我們經(jīng)常會(huì)見(jiàn)到const和volatile這兩個(gè)關(guān)鍵字,那么我們今天就來(lái)介紹下這兩個(gè)關(guān)鍵字,提起?const?關(guān)鍵字,我們可能首先想到的是經(jīng)過(guò)它修飾的變量便是常量了。其實(shí)我們這種想法是錯(cuò)誤的,其實(shí)?const?修飾的變量是只讀的,其本質(zhì)還是變量2022-04-04