Chinaunix首页 | 论坛 | 博客
  • 博客访问: 191639
  • 博文数量: 28
  • 博客积分: 1490
  • 博客等级: 上尉
  • 技术积分: 310
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-17 10:01
文章分类
文章存档

2012年(3)

2011年(2)

2008年(2)

2007年(7)

2006年(14)

我的朋友

分类: C/C++

2006-10-19 16:55:36

目录

一  
C 中的信息隐藏与封装

二   C 的继承与动态链接

引子


  
   这个系列将这样开始。

class klass
{
    // nothing

}


   请问: sizeof(klass) = ?
  
   如果您有确切的答案,那我想问一句,为什么? C 语言的面向对象的思想将很大程度上依赖于这么一个特性。那就是:


typedef struct _tag_my_struct my_struct;
struct _tag_my_struct
{
    int data; /* first */
    char* name;
    << ... >> /* others */
}

<< ... >>

my_struct test;
assert(&test == &(test.data));


   某一对象的地址与其第一个成员的地址是一致的。这一特性是语言赋于的,这无比重要!对象的继承与动态链接将依赖于此。

   让我们再回到第一个问题: sizeof(klass) == 1
  
   这是因为 C++ 会为其填充一个隐晦的字节来标识他,以区分不同的对象
。当我定义两个实例对象时(这是允许的,即使 klass 里面什么都没有):
   klass a;
   klass b;
如果 sizeof(klass) == 0 ,那么 &a == &b, 而这与对象是独立的原则是冲突的。所以,这就需要用一个占用最小空间的某一类型的元素来填充他,毫无疑问,这是 char 受之无愧的。

   假设这个隐晦的变量是:

class klass
{
private:
    char __to_be_unique;
}


   assert(&(a.__to_be_unique) != &(b.__to_be_unique));

   所以: assert(&a != &b),不同的对象就区分开来了;

   以上这些都是我的杜撰,但我想原理是正确的。所以想顺便提一句:不论在 C 还是 C++ 中,千万不要用前置下划线和中置双下划线做函数和变量的名称,这样您会进入语言和编译器的禁区。当然上例中这个隐晦变量的名称并不是这样的,但如果假设是这样的话,您再定义一个变量在里面如:ID __to_be_unique; 编译器会整死你!如果您特别喜欢_或__那么您一定要加上一个前缀或后缀来区分他们,e.g. your girl friend's name: ID _gfname__to_be_unique;

   扯远了。但做人要厚道,用情要专一啊,同志们!呵呵
阅读(2094) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~