天天看點

c++ data語意學

 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聲明外面

繼續閱讀