C++ static、const对象声明与定义 --续集--疑问?

昨天那个朋友告诉我处理const static的办法,程序却也跑起来了。但是昨晚睡觉的时候突然觉得不对头。看下面的代码:

int TestClass::m_nvar;
const int TestClass::m_cnsta_var = 0;
const int TestClass::m_con_var = 0;

这样的定义,不明显破坏了类的封装了么?而且main函数中TestClass::m_nvar++;这样的操作很明显就是可以破坏类封装的。看看类的定义:

class TestClass
{
public:
    TestClass();
    TestClass(int n);
    virtual ~TestClass(void);
    int m_ntestVar;
    static int m_nvar;
    const static int m_cnsta_var;
    static const int m_con_var ;
private:
public:
    int display(void);
};

看到static int m_nvar;他是static变量,可以在main还是操作?是的啊?他不是pubilc的么?这就更是完全有点恶搞了。是的,此处是public,要是我写成private呢。会如何?

class TestClass
{
public:
    TestClass();
    TestClass(int n);
    virtual ~TestClass(void);
private:
    int m_ntestVar;
    static int m_nvar;
    const static int m_cnsta_var;
    static const int m_con_var ;

public:
    int display(void);
};

错误信息:

1>Compiling...
1>demo_static.cpp
1>d:/documents/demo_static/demo_static.cpp(26) : error C2248: 'TestClass::m_nvar' : cannot access private member declared in class 'TestClass'
1>        d:/documents/demo_static/testclass.h(19) : see declaration of 'TestClass::m_nvar'
1>        d:/documents/demo_static/testclass.h(12) : see declaration of 'TestClass'

 

那么我改改main函数的内容:

再次编译,成功执行。

但是

int TestClass::m_nvar;
const int TestClass::m_cnsta_var = 0;
const int TestClass::m_con_var = 0;放到main函数所在的文件中,怕不是最好的,置于类实现中定然是可选的。尝试:

再次编译,一样成功。这样是类体定义的:

private:
    static int m_nvar;
    const static int m_cnsta_var;
    static const int m_con_var ;

static int m_nvar;不可在类体外访问(在main中操作失败了),保证的封装,而将

const static int m_cnsta_var;
    static const int m_con_var ;

放到main所在文件和类实现文件中,效果一样?但是保证了类的封装性,至少在我们对数据的透明上可以遮盖掉对数据内容的认知。

 

posted @ 2011-06-29 08:25  Podevor  阅读(225)  评论(0编辑  收藏  举报