類成員的編譯順序之嵌套類型對類的影響

 

  現在編譯器編譯類時按照如下順序:

    ①類成員的聲明

    ②成員函數的函數體在類全部可見後開始編譯

  而類成員的編譯順序則按照成員在類中的聲明順序進行編譯,其中類成員包括:①數據成員②成員函數③嵌套類型(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的影響。

  所以類的定義中包含嵌套類型時最好將嵌套類型放到類的起始處