码迷,mamicode.com
首页 > 编程语言 > 详细

c++ data语意学

时间:2017-09-26 23:45:09      阅读:442      评论:0      收藏:0      [点我收藏+]

标签:不能   2.0   public   namespace   ++   turn   布局   开头   一个   

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

 

c++ data语意学

标签:不能   2.0   public   namespace   ++   turn   布局   开头   一个   

原文地址:http://www.cnblogs.com/wangsicongde/p/7599280.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!