1. 程式人生 > 其它 >類成員的編譯順序之巢狀型別對類的影響

類成員的編譯順序之巢狀型別對類的影響

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

    ①類成員的宣告

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

  而類成員的編譯順序則按照成員在類中的宣告順序進行編譯,其中類成員包括:①資料成員②成員函式③巢狀型別(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的影響。

  所以類的定義中包含巢狀型別時最好將巢狀型別放到類的起始處