2011-02-03 91 views
2

我读布鲁斯Eckel的思维C++访问说明符

1.访问符下面的语句是结构的一部分,不影响从“结构创建对象

怀疑:正如我们所知道的访问块不是连续存储的,访问说明符改变了内存中对象布局的方式

的访问规范信息

2.所有消失在程序运行之前
。在一个正在运行的程序(编译时),对象成为
并没有什么“的存储区域” more..thus我们可以打破一切规则和访问内存直接
,你可以在C

怀疑:这是否意味着一个甚至可以直接访问私有成员,请帮助我理解上述声明

3.C++是设计要务实,不要追求抽象成交

怀疑:什么是务实的意思?

回答

7

1)访问说明符是结构的一部分,并且不影响从“结构”

错误实际创建该对象,在同一接入特定内的数据成员的顺序(在布局)( publicprotectedprivate)由它们在代码中的顺序决定,但是没有为具有不同指定符的数据成员指定顺序。

class Foo 
{ 
public: 
    int a; 
    int b; 
protected: 
    int c; 
    int d; 
}; 

我们唯一知道的是,a必须出现在bc一定要来d之前。 abcd,acbd,acdb,cabd,cadbcdab都是可能的。

2)该程序在编译过程中运行 ()。在运行程序之前所有的访问规范信息消失,对象成为 “的存储区域”,仅此而已。因此,我们可以打破所有规则和访问存储器直接 ,你可以在C

的信息编译时使用,但只能再编译生成什么运行代码。因此编译可确保您不会访问private成员。但是,由于允许直接内存操作,所以如果您愿意,您可以有效地访问成员或函数,但只是极易出错并尝试手动执行。

3)C++的设计是务实,不向往抽象真正

务实的手段,它的适应往真正的使用,很少考虑纯粹的理论论据。从CS理论建立的语言将包括Haskell,例如,它具有非常完善的数学背景;另一方面,C++已经积累了被用户认为有用的特性。

此外,C++不会隐藏您的底层细节(如内存管理)。良好的C++代码通常会让编译器使用习惯用法来尝试和抽象它(有点),但是如果有必要的话,你总是可以更接近金属(甚至直接包括汇编代码)......有时候(比如内存管理)你必须注意你在做什么。

+0

非常感谢你 – user388338 2011-02-03 12:56:16

1
class Foo { 
    int x, y; 
    public: 
    int z; 
    Foo(int a, int b) : x(a), y(b) {} 
}; 
Foo foo; 

你可以得到的私有成员变量很容易:

memset(&foo, int 0, sizeof(foo)); // wipes them all 
fwrite(&foo, sizeof(foo), 1, fp); // dumps them to stream fp 

正如一些评论者指出,这引发未定义行为的C++标准下,所以知道你的编译器,你试图在此之前(或更好, 别)。如果你知道编译器如何包类,您甚至可以通过黑客更细粒度的访问,如

struct PublicFoo { 
    int x, y, z; // order, padding, etc. depends on compiler 
}; 

,并铸造Foo *PublicFoo *。 C++运行库中没有任何内容阻止这一点。

+0

除了你调用未定义的行为。 – GManNickG 2011-02-03 08:52:50