来源:中国自学编程网 发布日期:2009-02-09 学习过C++已经好长时间了,但是一直都没机会去写C++代码,所以很多东西都已经给遗忘了。趁着假期,我重新找到了C++的学习资料来复习,并且写下一 些学习的笔记,供自己以后复习之用。下面是我的关于类的static,const,static const , const static成员的初始化问题的学习笔记。 1.类里的const成员初始化: 在一个类里建立一个const时,不能给它初值。像 class foo { private: const int i = 100; public: foo(){} ...... }; 这 样的初始化方式是不能通过编译的,因为在类对象里进行了存储空间分配,编译器不能知道const的内容是什么,所以不能把它用作编译期间的常量。这意味着 对于类里的常数表达式来说,const就像它在C中一样没有作用。因此这个初始化工作必须发生在构造函数里,并且,要在构造函数的某个特别的地方。因为 const必须在建立它的地方被初始化,所以在构造函数的主体里,const必须已初始化了,否则,就只有等待,直到在构造函数主体以后的某个地方给它初 始化,这意味着过一会儿才给const初始化。当然,无法防止在在构造函数主体的不同地方改变const的值。 构造函数初始化表达式 class foo { private: const int i = 100; public: foo(){......} ...... }; 如果构造函数是在类外定义,则可以这样写: class foo { private: const int i; public: foo(); ...... }; foo::foo(): i(100){......} 2.类里的static成员初始化: 类中的static变量是属于类的,而不是属于某个对象,它在整个程序的运行过程中只有一个副本,因此不 能在定义对象时对变量初始化,就是不能用构造函数来初始化。其正确的初始化方式是: <数据类型><类名>::<静态数据成员名>=<值> ,例如 class foo { private: const int i; public: foo(); ...... }; int foo::i=100; 这表明: (1)初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆。 (2)初始化时不加该成员的访问权限控制符private,public等。 (3)初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。 3.类里的static const 和const static成员初始化: (可在类外和类内初始化,也可以不初始化。) 在 找static成员的初始化学习资料时,笔者发现了网上有很多关于 static const 成员,也就是全局的静态常量的初始化的资料。const成员要在构造函数初始化,而static成员在需要在在类体外初始化,那么static const 和 const static 的成员应该在哪里进行初始化呢?这两个写法又会有什么不一样吗?这引起了笔者的兴趣。在网上查阅了相关资料和做了相关实验后,笔者确认了只要用 static关键字修饰的成员的初始化方式和只有static关键字修饰的成员一样,都必须在类体外初始化,而无论static在const前面还是后 面。比如: class Test{ public: static const int MASK1; static const int MASK2; }; const int Test::MASK1 = 0xFFFF; const int Test::MASK2 = 0xFFFF; 至于两种方式的区别,我还不知道,下面是在网上找到的一个关于它们区别的说法,仅供大家参考: 没有区别。 一个是静态常量, 一个是常量静态, 静态都将存储在全局变量区域,其实最后结果都是一样的。 可能在不同编译器内,不同处理,但是最后结果是一样的。
转载请注明原文地址: https://ibbs.8miu.com/read-2234259.html