詳解C++編程中的嵌套類的聲明與其中的函數(shù)使用
可以在一個類的范圍內(nèi)聲明另一個類。這樣的類稱為“嵌套類”。 嵌套類被視為在封閉類的范圍內(nèi)且可在該范圍內(nè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。這些類名稱在類 BufferedIO 的范圍外不可見。但是,BufferedIO 類型的對象不包含 BufferedInput 或 BufferedOutput 類型的任何對象。
嵌套類只能從封閉類中直接使用名稱、類型名稱,靜態(tài)成員的名稱和枚舉數(shù)。若要使用其他類成員的名稱,您必須使用指針、引用或?qū)ο竺?br />
在前面的 BufferedIO 示例中,枚舉 IOError 可由嵌套類中的成員函數(shù)、BufferedIO::BufferedInput 或 BufferedIO::BufferedOutput 直接訪問,如函數(shù) good 中所示。
注意
嵌套類僅在類范圍內(nèi)聲明類型。它們不會導(dǎo)致創(chuàng)建嵌套類的包含對象。前面的示例聲明兩個嵌套類,但未聲明這些類類型的任何對象。
在將類型名稱與前向聲明一起聲明時,會引發(fā)嵌套類聲明的范圍可見性的異常。在這種情況下,由前向聲明聲明的類名在封閉類的外部可見,其范圍定義為最小的封閉非類范圍。例如:
// 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; }
嵌套類中的訪問權(quán)限
將一個類嵌入另一個類中不會為嵌入類的成員函數(shù)提供特殊訪問權(quán)限。同樣,封閉類的成員函數(shù)不具有對嵌套類的成員的特殊訪問權(quán)限。
嵌套類中的成員函數(shù)
在嵌套類中聲明的成員函數(shù)可在文件范圍中定義。前面的示例可能已編寫:
// 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 語法用于聲明函數(shù)名稱。聲明:
BufferedIO::BufferedInput::read()
表示“作為 read 類(位于 BufferedInput 類的范圍中)的成員的 BufferedIO 函數(shù)?!?由于此聲明使用 qualified-type-name 語法,因此以下形式的構(gòu)造是可能的:
typedef BufferedIO::BufferedInput BIO_INPUT; int BIO_INPUT::read()
上述聲明與前一個聲明等效,但它使用了 typedef 名稱來代替類名稱。
嵌套類中的友元函數(shù)
嵌套類中聲明的友元函數(shù)被認(rèn)為是在嵌套類而不是封閉類的范圍內(nèi)。因此,友元函數(shù)未獲得對封閉類的成員或成員函數(shù)的特定訪問權(quán)限。如果需要使用在友元函數(shù)中的嵌套類中聲明的名稱,并且友元函數(shù)是在文件范圍內(nèi)定義的,請使用限定的類型名稱,如下所示:
// 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ù)制到類成員中。請注意,GetExtendedErrorStatus 的更佳實現(xiàn)是將其聲明為:
int GetExtendedErrorStatus( char *message )
利用前面的接口,許多類可以通過傳遞要復(fù)制錯誤消息的內(nèi)存位置來使用此函數(shù)的服務(wù)。
上一篇:結(jié)合C++11新特性來學(xué)習(xí)C++中l(wèi)ambda表達(dá)式的用法
欄 目:C語言
下一篇:解析C++中的for循環(huán)以及基于范圍的for語句使用
本文標(biāo)題:詳解C++編程中的嵌套類的聲明與其中的函數(shù)使用
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2526.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10求子數(shù)組最大和的解決方法詳解
- 01-10深入二叉樹兩個結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)的詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計- 解析最少換車次數(shù)的問題詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-用棧實現(xiàn)表達(dá)式求值的方法詳解
- 01-10HDOJ 1443 約瑟夫環(huán)的最新應(yīng)用分析詳解
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10如何查看進(jìn)程實際的內(nèi)存占用情況詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10C#中split用法實例總結(jié)
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改