现在编译器编译类时按照如下顺序:
①类成员的声明
②成员函数的函数体在类全部可见后开始编译
而类成员的编译顺序则按照成员在类中的声明顺序进行编译,其中类成员包括:①数据成员②成员函数③嵌套类型(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的影响。
所以类的定义中包含嵌套类型时最好将嵌套类型放到类的起始处。