類成員的編譯順序之巢狀型別對類的影響
阿新 • • 發佈:2021-06-19
現在編譯器編譯類時按照如下順序:
①類成員的宣告
②成員函式的函式體在類全部可見後開始編譯
而類成員的編譯順序則按照成員在類中的宣告順序進行編譯,其中類成員包括:①資料成員②成員函式③巢狀型別(nested type)④列舉成員⑤模板成員。
由於成員函式的宣告包括返回型別,函式名和形參列表。所以其中形參列表和返回型別可能受到巢狀型別定義位置的影響,示例如下:
1 #include <typeinfo> 2 #include <iostream> 3 #include <string> 4 using namespacestd; 5 typedef string length; 6 class A 7 { 8 public: 9 void foo(length a) 10 { 11 cout<<typeid(a).name()<<endl; 12 } 13 typedef int length; 14 length b; 15 }; 16 17 int main() 18 { 19 A a; 20 cout<<typeid(a.b).name()<<endl;21 a.foo("abc"); 22 }
輸出結果
i
NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
可以看出成員函式foo的形參型別受到全域性類型別名length的控制,型別為string,而資料成員b的型別則受到巢狀型別length的影響。
所以類的定義中包含巢狀型別時最好將巢狀型別放到類的起始處。