考虑如下代码:
extern float x = 6.66;
class Point3d {
public:
float X() {return x;}
private:
float x, y, z;
};
Point3d::X()
传回来的是Point3d
内部的x
; 而在早期的的C++编译器上,该操作会指向global x object
!并因此导出早期C++的两种防御性程序设计风格:
- 把所有的
data members
放在class的声明起头处,以保证正确的绑定
class Point3d {
// 防御性设计风格,在class声明处防止所有的data member
float x, y, z;
public:
float X() {return x;}
};
- 把所有的
inline functions
,不管大小都放在class声明之外
class Point3d {
// 防御性设计风格,在class声明处防止所有的data member
float x, y, z;
public:
// 防御性设计风格,把所有的inlines移到class之外
Point3d();
float X() const;
};
inline float Point3d::X() const [
return x;
}
如果一个inline
函数在class
声明之后立刻被定义的话,那么就还是对其评估求值;如下代码:
extern int x;
class {
public:
// 对于函数本体的分析將延迟,直到class声明的右大括号出现菜开始
float X() const {return x;}
private:
float x;
};
// 事实上,分析在这里进行
对member functions
本体的分析,会直到整个class的声明都出现了才开始,因此在一个inline member function
之内的一个data member
绑定操作,会在整个class
声明完成之后才发生。
然而,这对于member function
的argument list并不为真。如下:
typedef int length;
class Point3d {
public:
void mumble(length val) {_val = val;};
length mumble() {
return _val;
}
private:
// error: declaration of ‘typedef float Point3d::length’ changes meaning of ‘length’ [-fpermissive
typedef float length;
length _val;
};
length
的类型在两个member function sigatures
中都决议为global typedef
,也就是int,当后续再有length
的nested typedef
声明出现时,C++ standarnd久把稍早的绑定示为非法