c++ data语意学

case1  :数据成员的绑定

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的起始处。

时间: 2024-08-08 04:18:52

c++ data语意学的相关文章

data语意学

引例: class X{}; class Y:public virtual X{}; class Z:public virtual X{}; class A:public Y,public Z{}; X Y Z A类对象的大小是多少?? 1> 没有提供empty virtual base特殊支持的编译器:1 8 8 12 2> 提供了empty virtual base特殊支持的编译器:1 4 4 8 一个class的data members,一般而言,可以表现这个class在程序执行时的某种

《深度探索c++对象模型》chapter3 Data语意学

一个空的class:如 class X{} ; sizeof(X)==1; sizeof为什么为1,他有一个隐晦的1 byte,那是被编译器安插进去的一个char,这使得class2的两个objects得以在内存中配置独一无二的地址: X a,b; if(&a==&b) cerr<<"yipes!"<<endl; class X{}; class Y:public virtual X{}; class Z:public virtual X{};

Data语意学里的一些问题

今天和小伙伴讨论了第三章data语意学的指一些的知识,感觉很有必要总结一下,似乎不总结知识就会溜走,所以冒夜写一下吧. 首先看这样的一个继承的例子: class X{ }; class Y: public virtualX { }; class Z: public virtualX { }; class A: public Y,publicZ { }; 分别对X Y Z A取sizeof,结果可能是1, 8, 8, 12.当然我的机器是1, 4, 4, 8.一般来说老的机器会是第一种结果,因为编

C++对象模型——Data 语意学(第三章)

第3章    Data 语意学 计算如下代码的sizeof结果: class X{}; class Y : public virtual X{}; class Z : public virtual X{}; class A : public Y, public Z{}; 上述X,Y,Z,A中没有任何一个 class 内含明显的数据,只表示了继承关系,所以认为每一个 class 的大小都是0.这样想法是错误的.即使 class X的大小也不为0. 一个空的 class 如: // sizeof(X

深度探索C++对象模型 第三章 Data 语意学

一个有趣的问题:下列 类 sizeof大小 class X{}    //1 class Y:public virtual X{} //4 or 8 class Z:public virtual X{} // 4 or 8 class A:public Y,public Z{} // 8 or 12 主要原因:为了保持每一个类生成对象在内存中的唯一性,编译器必须要给空类生成一个char来维持object的唯一性: 而virtual继承中,仅保持了base class的指针,有些编译器会继承bas

【C++】深度探索C++对象模型读书笔记--Data语意学(The Semantics of data)

1. 一个空类的大小是1 byte.这是为了让这一类的两个对象得以在内存中配置独一无二的地址. 2. Nonstatic data member 放置的是“个别的class object”感兴趣的数据,static data members则放置的是“整个class”感兴趣的数据. 3. C++对象模型把nonstatic data members直接放在每一个classs object之中.对于继承而来的nonstatic data members(不管是virtual 还是nonvirtua

Data 语意学 —— 数据成员的绑定、布局与存取

数据成员的绑定 早期的 C++ 编译器为了能够正确绑定具体的数据成员,规定了以下两种行为: 所有的 data member 必须放在 class 声明的起始处: 所有的 inline functions 放在 class 声明之外: 从早期的编译器可以知道,绑定数据成员类型必须要在 class 声明完成之后才能确定,但是现在 C++ 编译器不必要要求上面的规定,也可以正确绑定具体的数据成员,例如: extern float x; class Pointer{ public: Pointer(fl

第三章、Data语意学

无虚继承的空类占一个字节,用于标记该类.有虚继承的空类至少占4个字节(可能继承的空类占很大空间).对齐情况class X{float i;//8char j;//1int k;//4double b;//下面重新的字节8,上面用来对齐};sizeof(X)=24 class Y{char j;//1int k;//4};sizeof(Y)=8 class Z{char j;//1int k;//4double b;};sizeof(Y)=16 1.Data Member的绑定有两种情况:情况一:

Data 语意学---Data member的存取效率

<深度探索C++对象模型> 对于data member来说,有两种情况 static data member数据 每一个static data member只有一个实体,存放在程序的data segment之中,无论以何种方式,无论类的继承关系如何复杂,存取路径都是非常直接 Nonstatic data members 直接存放在一个class object之中,是属于一个对象的,是需要一个叫做偏移量的值来索引的. 尤其是虚拟继承,虚拟继承将为"经由base class subobj