• 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的布局

  • 相关阅读:
    Oracle 删表前验证表名是否存在并且删除
    Mysql的建表规范与注意事项
    MYSQL总结之sql语句大全
    主机屋云服务器(绑定域名)初探
    (十)Thymeleaf用法——Themeleaf内联
    (九)Thymeleaf用法——Themeleaf注释
    (八)Thymeleaf的 th:* 属性之—— 模板布局& th:with& 属性优先级
    (七)Thymeleaf的 th:* 属性之—— th: ->设值& 遍历迭代& 条件判断
    (六)Thymeleaf的 th:* 属性之—— th: ->text& utext& href
    (五)Thymeleaf标准表达式之——[7->8]条件表达式& 默认表达式
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/6286492.html
Copyright © 2020-2023  润新知