類成員的編譯順序之嵌套類型對類的影響
- 2021 年 6 月 19 日
- 筆記
- 深度探索C++對象模型
現在編譯器編譯類時按照如下順序:
①類成員的聲明
②成員函數的函數體在類全部可見後開始編譯
而類成員的編譯順序則按照成員在類中的聲明順序進行編譯,其中類成員包括:①數據成員②成員函數③嵌套類型(nested type)④枚舉成員⑤模板成員。
由於成員函數的聲明包括返回類型,函數名和形參列表。所以其中形參列表和返回類型可能受到嵌套類型定義位置的影響,示例如下:
1 #include <typeinfo> 2 #include <iostream> 3 #include <string> 4 using namespace std; 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的影響。
所以類的定義中包含嵌套類型時最好將嵌套類型放到類的起始處。