3.1 Data Member的绑定

这篇博客讨论了早期C++编译器中关于成员函数和数据成员绑定的问题,指出在类声明中放置数据成员的位置以及inline函数定义的位置可能会影响代码的行为。文章提到了两种防御性编程风格:将所有数据成员放在类声明的开头和将所有inline函数定义移出类声明。还解释了成员函数参数列表中的类型解析在类声明完成后才会进行,导致可能的命名冲突。
摘要由CSDN通过智能技术生成

考虑如下代码:

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++的两种防御性程序设计风格:

  1. 把所有的 data members放在class的声明起头处,以保证正确的绑定
class Point3d {
	// 防御性设计风格,在class声明处防止所有的data member
    float x, y, z;
public:
    float X()  {return x;}
};
  1. 把所有的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;}
privatefloat 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,当后续再有lengthnested typedef声明出现时,C++ standarnd久把稍早的绑定示为非法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值