先来看一段代码
extern float x;
class Point3d
{
public:
Point3d(float,float,float);
float X() const { return X; }
void X(float new_x ) const { x=new_x; }
private:
float x,y,z;
};
现在如果有人问,X()返回的是哪一个x,直觉会告诉我们返回的是point3d的成员变量x。答案是正确的,但是函数X()的声明明明在成员变量x的前边,为什么他返回的不是外部的x呢?
因为现在的编译器会把所有的内联函数放在类定义的尾部大括号后边解析,再加上绑定的搜索顺序是从内到外的,所以一定是成员变量先被看到,于是被绑定的是成员变量。
但是并不是每次都可以通过直觉得出正确的结论
typedef int length;
class point
{
public:
void mumble(length val)
{
_val=val;
}
length mumble()
{
return _val;
}
private:
typedef double length;
length _val;
};
int main ()
{
point X;
X.mumble(3);
cout<<sizeof(X.mumble())<<endl;
}
猜猜会发生什么?直觉告诉我们成员函数中的两个length表示的应该是double的含义,所以val理所应当的被赋值给_val,_val理所应当的被当作double返回。
但其实不然,对于成员函数的参数表来说,它们还是会在第一次遭遇时,被适当的决议,它们都是int类型。
这意味着你做了两次危险的转型操作,而你对此事的发生毫不知情。
验证如下
所以正确的做法是,如果你想在类内进行typedef,那就把它放在类的开始处,这样可以确保你的直觉依旧准确。