Chinaunix首页 | 论坛 | 博客
  • 博客访问: 368033
  • 博文数量: 715
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:46
文章分类

全部博文(715)

文章存档

2011年(1)

2008年(714)

我的朋友

分类:

2008-10-13 16:30:20

文如标题,所以我想就这个问题展开两个方面的探讨,一个是这种规定有什么用,一个就是为什么这种用法成立。
1.先来探讨这种用法有什么用处。
我们可以试想一个应用场景,我们想在类A里定义一个这样的数据成员,这个数据成员是int类型,并且是所有类的实例所共有的,第三还是const.天啊,怎么会有这么多的修饰。其实最简单的一个例子就是在类里定义一个自己类内部数组的大小。例如:
class X {
public:
    static const int size1 = 7;
    enum { size2 = 19 };
 
    char v1[size1];
    char v2[size2];
 
    // ...
};
如果我们不这么定义,那可以采用什么方法呢?第一,我觉得可以用#define SIZE1 7,喔,这样就违反了Effective C++ 3rd Item 2. 第二,或者可以定义一个全局的const int size1 = 7,可总是感觉不舒服,因为这样定义总觉得和类联系不够紧密。那么现在我们也只好承认这种用法是有其用武之地的了。
补充说明:一般认为在类里写的数据成员啊都是声明,除这个用例除外。但请记住,这个特例必须满足三个条件:static&const&integral.

2.再来讨论讨论为什么有这种用法在C++里成立呢?
首先需要说明的是,这种用法的存在就是因为编译器可以把static&const&integral当作常量看待。接着我再想采用反证法来证明:
第一,如果C++规定类里所有的数据成员都可以在类里初始化,那么这样导致的问题是:类在一个头文件中被声明,而头文件被包含到许多互相调用的单元去。但是,为了避免复杂的编译器规则,C++要求每一个对象只有一个单独的定义。如果 C++允许在类内部定义一个和对象一样占据内存的实体的话,这种规则就被破坏了。有可能这是C++出于设计的平衡。
第二, 如果是static&const&float呢?这个我也不知道,如果有人知道请告诉我一声。


--------------------next---------------------

阅读(162) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~