Data Member的綁定
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的起始處。
對于上述的幾種情況解釋為:
在早期的編譯器中,如果發現有全局變量和class内部的變量沖突的時候,在程式走到類聲明裡面發現内聯函數的時候,會将内聯函數裡面的值設定為全局變量的值,但是這樣就違背了我們的基本操作:為此早期的c++做了兩種預防措施
(1):将data的聲明放在class的啟示位置,隐藏了全局變量
(2)将内聯函數放在class聲明外面