zoukankan      html  css  js  c++  java
  • 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声明外面

    后来c++ stanred开始做了编译的改变:在编译到class声明里面的时候,如果发现了内联函数,那么不会做评估求值,直到class声明结束以后,才会做求值,其实这多少有点和早期的第二种预防措施类似,但是这仍然有一个弊端,就是这不能保证参数的类型评估求值也发生在声明结束,就相当于上述的两个tyoedef和内嵌的类型定义,这种解释评估发生了第一次遇见,所以我们此时能做的预防措施就是讲内置类型放在class声明的开头,隐藏外部的typedef

     Data Member的布局

  • 相关阅读:
    HDU 1269 迷宫城堡
    HDU 4771 Stealing Harry Potter's Precious
    HDU 4772 Zhuge Liang's Password
    HDU 1690 Bus System
    HDU 2112 HDU Today
    HDU 1385 Minimum Transport Cost
    HDU 1596 find the safest road
    HDU 2680 Choose the best route
    HDU 2066 一个人的旅行
    AssetBundle管理机制(下)
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/6286492.html
Copyright © 2011-2022 走看看