C++ static、const对象声明与定义 --续集--疑问?
2011-06-29 08:25
393 查看
昨天那个朋友告诉我处理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所在文件和类实现文件中,效果一样?但是保证了类的封装性,至少在我们对数据的透明上可以遮盖掉对数据内容的认知。
#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所在文件和类实现文件中,效果一样?但是保证了类的封装性,至少在我们对数据的透明上可以遮盖掉对数据内容的认知。
相关文章推荐
- C++ static、const对象声明与定义 --续集--疑问?
- C++ static、const对象声明与定义
- C++ static、const对象声明与定义 问题来源?
- C++ static、const对象声明与定义 问题 最终解决了
- C++ static、const对象声明与定义
- C++ static、const对象声明与定义 问题来源?
- C++ static、const对象声明与定义 问题 最终解决了
- 何时应将引用形参定义为 const 对象?如果在需要 const 引用时,将形参定 义为普通引用,则会出现什么问题?
- 一道关于函数声明与对象定义的笔试题
- C++头文件的若干说明和const对象定义
- Objective-C学习笔记(十八)——对象方法和类方法的声明,定义及调用
- const int *a, int const *a,int * const a,区别,指针数组,数组指针,声明与定义
- 7.21声明一个学生类(学号,姓名,性别)同时定义对象
- C++类的声明和对象的定义
- C/C++中使用static关键字定义或声明静态对象
- C++类的声明和对象的定义——形式2(推荐)
- const常量用extern声明定义的问题(extern变量不能在使用类里初始化)
- Objective-C 基础,类和对象,方法和消息,已声明的属性和存取方法,块对象,协议和范畴类,预定义类型和编码策略