詳解C++編程中的嵌套類的聲明與個中的函數應用。本站提示廣大學習愛好者:(詳解C++編程中的嵌套類的聲明與個中的函數應用)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C++編程中的嵌套類的聲明與個中的函數應用正文
可以在一個類的規模內聲明另外一個類。如許的類稱為“嵌套類”。 嵌套類被視為在關閉類的規模內且可在該規模內應用。若要從嵌套類的即時關閉規模以外的某個規模援用該類,則必需應用完整限制名。
上面的示例演示若何聲明嵌套類:
// 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 類型的任何對象。
嵌套類只能從關閉類中直接應用稱號、類型稱號,靜態成員的稱號和列舉數。若要應用其他類成員的稱號,您必需應用指針、援用或對象名。
在後面的 BufferedIO 示例中,列舉 IOError 可由嵌套類中的成員函數、BufferedIO::BufferedInput 或 BufferedIO::BufferedOutput 直接拜訪,如函數 good 中所示。
留意
嵌套類僅在類規模內聲明類型。它們不會招致創立嵌套類的包括對象。後面的示例聲明兩個嵌套類,但未聲明這些類類型的任何對象。
在將類型稱號與前向聲明一路聲明時,會激發嵌套類聲明的規模可見性的異常。在這類情形下,由前向聲明聲明的類名在關閉類的內部可見,其規模界說為最小的關閉非類規模。例如:
// 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; }
嵌套類中的拜訪權限
將一個類嵌入另外一個類中不會為嵌入類的成員函數供給特別拜訪權限。異樣,關閉類的成員函數不具有對嵌套類的成員的特別拜訪權限。
嵌套類中的成員函數
在嵌套類中聲明的成員函數可在文件規模中界說。後面的示例能夠已編寫:
// 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 語法用於聲明函數稱號。聲明:
BufferedIO::BufferedInput::read()
表現“作為 read 類(位於 BufferedInput 類的規模中)的成員的 BufferedIO 函數。” 因為此聲明應用 qualified-type-name 語法,是以以下情勢的結構是能夠的:
typedef BufferedIO::BufferedInput BIO_INPUT; int BIO_INPUT::read()
上述聲明與前一個聲明等效,但它應用了 typedef 稱號來取代類稱號。
嵌套類中的友元函數
嵌套類中聲明的友元函數被以為是在嵌套類而不是關閉類的規模內。是以,友元函數未取得對關閉類的成員或成員函數的特定拜訪權限。假如須要應用在友元函數中的嵌套類中聲明的稱號,而且友元函數是在文件規模內界說的,請應用限制的類型稱號,以下所示:
// 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() { }
以下代碼演示聲明為友元函數的函數 GetExtendedErrorStatus。在文件規模內界說的函數中,將新聞從靜態數組復制到類成員中。請留意,GetExtendedErrorStatus 的更佳完成是將其聲明為:
int GetExtendedErrorStatus( char *message )
應用後面的接口,很多類可以經由過程傳遞要復制毛病新聞的內存地位來應用此函數的辦事。