case1 :数据成员的绑定
extern float x; class Point3d { public: point3d(); //问题:被传回和被设定的x是哪一个x呢? float X() const { return x; } private: float x, y, z;//Point3d::X()将返回内部的x。 };
在早期(2.0之前)C++的编译器上,将会指向global x object, 导致C++的两种防御性程序设计风格:
1、把所有的data members放在class 声明起头处,以确保正确的绑定
2、把所有的inline functions, 不管大小都放在class声明之外
对于 member function的argument list并不为真(同以上情况相反)。
-----------------------------------------------------------------
对于下面两个代码,第一个错误的,第二个是正确的
typedef int length; class Point3d { public: //length 将被决议为global //_val将被决议为Point3d::_val void mumbel(length val) { _val = val; } length mumble() { return _val; } private: //导致 _val = val; return _val;不合法 typedef float length; length _val; };
#include<stdio.h> #include<iostream> #include<algorithm> using namespace std; typedef int length; class base { public: //length 将被决议为global //_val将被决议为Point3d::_val void mumbel(length val) { _val = val; } length mumble() { return _val; } private: //导致 _val = val; return _val;不合法 typedef float length; length _val; }; int main(){ base ptr; ptr.mumbel(5); cout<<ptr.mumble()<<endl;; return 0; }
预防性程序风格:请始终把“nested type 声明”放在class的起始处。
时间: 2024-10-13 01:48:06