詳解C++編程中的sizeof運算符與typeid運算符。本站提示廣大學習愛好者:(詳解C++編程中的sizeof運算符與typeid運算符)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解C++編程中的sizeof運算符與typeid運算符正文
sizeof 運算符
發生與 char 類型的年夜小有關的操作數年夜小。
語法
sizeof unary-expression sizeof ( type-name )
備注
sizeof 運算符的成果為 size_t 類型,它是包括文件 STDDEF.H 中界說的整數類型。應用此運算符,你可以免在法式中指定依附於盤算機的數據年夜小。
sizeof 的操作數可所以以下項之一:
類型稱號。若要將 sizeof 用於類型稱號,則該稱號必需用括號括起。
一個表達式。當用於表達式時,不管能否應用括號都可指定 sizeof。不盤算表達式。
當 sizeof 運算符運用到 char 類型的對象時,它將生成 1。當 sizeof 運算符運用到數組時,它將發生該數組的字節總數,而非由數組標識符表現的指針的年夜小。若要獲得由數組標識符表現的指針的年夜小,請將其作為參數傳遞給應用 sizeof 的函數。例如:
#include <iostream> using namespace std; size_t getPtrSize( char *ptr ) { return sizeof( ptr ); } int main() { char szHello[] = "Hello, world!"; cout << "The size of a char is: " << sizeof( char ) << "\nThe length of " << szHello << " is: " << sizeof szHello << "\nThe size of the pointer is " << getPtrSize( szHello ) << endl; }
示例輸入
The size of a char is: 1 The length of Hello, world! is: 14 The size of the pointer is 4
當 sizeof 運算符運用到 class、struct 或 union 類型時,成果為該類型的對象中的字節數,和添加的用於在字界限上對齊成員數據的任何填充。成果紛歧定對應於經由過程將各個成員的存儲需求相加盤算出的年夜小。 /Zp 編譯器選項和 pack 雜注會影響成員的對齊界限。
sizeof 運算符永久不會發生 0,即便關於空類也是如斯。
sizeof 運算符不克不及用於以下操作數:
函數。(然則,sizeof 可運用於指向函數的指針。)
位域。
不決義的類。
void 類型。
靜態分派的數組。
內部數組。
不完全類型。
帶括號的不完全類型的稱號。
當 sizeof 運算符運用於援用時,成果與 sizeof 運用到對象自己時的成果雷同。
假如某個未肯定年夜小的數組是構造的最初一個元素,則 sizeof 運算符將前往沒有該數組的構造的年夜小。
sizeof 運算符平日用於經由過程應用以下情勢的表達式盤算數組中的元素數目:
sizeof array / sizeof array[0]
typeid 運算符
語法
typeid( type-id ) typeid( expression ) ( expression )
備注
typeid 運算符許可在運轉時肯定對象的類型。
typeid 的成果是 const type_info&。該值是對表現 type-id 或 expression 的類型的 type_info 對象的援用,詳細取決於所應用的 typeid 的情勢。
typeid 運算符不實用於托管類型(籠統聲明符或實例)。
typeid 運算符在運用於多態類類型的左值時履行運轉時檢討,個中對象的現實類型不克不及由供給的靜態信息肯定。此類情形是:
對類的援用
應用 * 撤消援用的指針
帶下標的指針(即 [ ])。(請留意,平日情形下,將下標與指向多態類型的指針一路應用不平安。)
假如 expression 指向基類類型,但該對象現實上是派生自該基類的類型,則派生類的 type_info 援用是成果。 expression 必需指向多態類型(具有虛函數的類)。不然,成果是 expression 中援用的靜態類的 type_info。另外,必需撤消援用指針以應用它指向的對象。假如未撤消援用指針,成果將是指針的 type_info,而不是它指向的內容。例如:
// expre_typeid_Operator.cpp // compile with: /GR /EHsc #include <iostream> #include <typeinfo.h> class Base { public: virtual void vvfunc() {} }; class Derived : public Base {}; using namespace std; int main() { Derived* pd = new Derived; Base* pb = pd; cout << typeid( pb ).name() << endl; //prints "class Base *" cout << typeid( *pb ).name() << endl; //prints "class Derived" cout << typeid( pd ).name() << endl; //prints "class Derived *" cout << typeid( *pd ).name() << endl; //prints "class Derived" delete pd; }
假如 expression 正在撤消援用某個指針,而且該指針的值是零, typeid 將激發 bad_typeid 異常。假如該指針沒有指向有用的對象,則會激發 __non_rtti_object 異常來指導測驗考試了剖析激發毛病(如拜訪抵觸)的 RTTI,由於該對象在某種水平上是有效的(有效的指針或代碼不是用 /GR 編譯的)。
假如 expression 既不是指針也不是對對象的基類的援用,則成果是表現 expression 的靜態類型的 type_info 援用。表達式的 static type 將援用在編譯時已知的表達式的類型。在盤算表達式的靜態類型時,將疏忽履行語義。另外,在肯定表達式的靜態類型時,將疏忽援用(假如能夠):
// expre_typeid_Operator_2.cpp #include <typeinfo> int main() { typeid(int) == typeid(int&); // evaluates to true } typeid 還可在模板中應用以肯定模板參數的類型: // expre_typeid_Operator_3.cpp // compile with: /c #include <typeinfo> template < typename T > T max( T arg1, T arg2 ) { cout << typeid( T ).name() << "s compared." << endl; return ( arg1 > arg2 ? arg1 : arg2 ); }