您的位置:首页 > 编程语言 > C语言/C++

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

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

#include "TestClass.h"
//static const  int TestClass::m_con_var;
//int TestClass::m_nvar = 0;
//int TestClass::m_cnsta_var = 12;
//TestClass::m_ntestVar
//extern const int m_con_var;
/*int TestClass::m_con_var = 0*/;
int TestClass::m_nvar;
const int TestClass::m_cnsta_var = 0;
const int TestClass::m_con_var = 0;
int main(int argc, char * argv[])
{
	TestClass tc(10);
	TestClass tc1(120);
	TestClass tcc[100];
	int i = 0;
	//TestClass::m_cnsta_var = 5;
    //TestClass::m_con_var = 3;
    TestClass::m_nvar++;
	while(i < 100){
		tcc[i] = TestClass(0);
		i++;
	}
	return 0;
}




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函数的内容:

#include "TestClass.h"
//static const  int TestClass::m_con_var;
//int TestClass::m_nvar = 0;
//int TestClass::m_cnsta_var = 12;
//TestClass::m_ntestVar
//extern const int m_con_var;
/*int TestClass::m_con_var = 0*/;
int TestClass::m_nvar;
const int TestClass::m_cnsta_var = 0;
const int TestClass::m_con_var = 0;
int main(int argc, char * argv[])
{
	TestClass tc(10);
	TestClass tc1(120);
	TestClass tcc[100];
	int i = 0;
	//TestClass::m_cnsta_var = 5;
    //TestClass::m_con_var = 3;
   // TestClass::m_nvar++;
	while(i < 100){
		tcc[i] = TestClass(0);
		i++;
	}
	return 0;
}




再次编译,成功执行。

但是

int TestClass::m_nvar;

const int TestClass::m_cnsta_var = 0;

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

//////////////
//fileName:TestClass.cpp
////////////
#include "TestClass.h"
int TestClass::m_nvar;
const int TestClass::m_cnsta_var = 0;
const int TestClass::m_con_var = 0;
//int TestClass::m_nvar;
//const int TestClass::m_cnsta_var = 0;
//const int TestClass::m_con_var = 0;
TestClass::TestClass(){
}
TestClass::TestClass(int n):m_ntestVar(n)
{
	
	cout << "m_nvar" << TestClass::m_nvar << endl;
	cout << "this->m_ntestVar" << this->m_ntestVar << endl;
	cout << "m_cnsta_var" << TestClass::m_cnsta_var << endl;
	
	TestClass::m_nvar++;
	//TestClass::m_cnsta_var;
}

TestClass::~TestClass(void)
{
	cout << TestClass::m_nvar << endl;
}



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

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所在文件和类实现文件中,效果一样?但是保证了类的封装性,至少在我们对数据的透明上可以遮盖掉对数据内容的认知。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: