`
BlogDown
  • 浏览: 213730 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

C++ static、const和static const 以及它们的初始化

C++ 
阅读更多

const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间。

      static表示的是静态的。类的静态成员函数、静态成员变量是和类相关的,而不是和类的具体对象相关的。即使没有具体对象,也能调用类的静态成员函数和成员变量。一般类的静态函数几乎就是一个全局函数,只不过它的作用域限于包含它的文件中。

      在C++中,static静态成员变量不能在类的内部初始化。在类的内部只是声明,定义必须在类定义体的外部,通常在类的实现文件中初始化,如:double Account::Rate=2.25;static关键字只能用于类定义体内部的声明中,定义时不能标示为static

      在C++中,const成员变量也不能在类定义处初始化,只能通过构造函数初始化列表进行,并且必须有构造函数。

      const数据成员 只在某个对象生存期内是常量,而对于整个类而言却是可变的因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类的声明中初始化const数据成员,因为类的对象没被创建时,编译器不知道const数据成员的值是什么。

      const数据成员的初始化只能在类的构造函数的初始化列表中进行。要想建立在整个类中都恒定的常量,应该用类中的枚举常量来实现,或者static cosnt。

  1. class Test  
  2. {  
  3. public:  
  4.       Test():a(0){}  
  5.       enum {size1=100,size2=200};  
  6. private:  
  7.       const int a;//只能在构造函数初始化列表中初始化  
  8.        static int b;//在类的实现文件中定义并初始化  
  9.       const static int c;//与 static const int c;相同。  
  10. };  
  11.   
  12. int Test::b=0;//static成员变量不能在构造函数初始化列表中初始化,因为它不属于某个对象。  
  13. cosnt int Test::c=0;//注意:给静态成员变量赋值时,不需要加static修饰符。但要加cosnt  

 

      cosnt成员函数主要目的是防止成员函数修改对象的内容。即const成员函数不能修改成员变量的值,但可以访问成员变量。当方法成员函数时,该函数只能是const成员函数。

      static成员函数主要目的是作为类作用域的全局函数。不能访问类的非静态数据成员。类的静态成员函数没有this指针,这导致:1、不能直接存取类的非静态成员变量,调用非静态成员函数2、不能被声明为virtual

关于static、const、static cosnt、const static成员的初始化问题:

1、类里的const成员初始化:

在一个类里建立一个const时,不能给他初值

  1. class foo  
  2. {  
  3. public:  
  4.       foo():i(100){}  
  5. private:  
  6.       const int i=100;//error!!!  
  7. };  
  8. //或者通过这样的方式来进行初始化  
  9. foo::foo():i(100)  
  10. {}  

 

2、类里的static成员初始化:

      类中的static变量是属于类的,不属于某个对象,它在整个程序的运行过程中只有一个副本,因此不能在定义对象时 对变量进行初始化,就是不能用构造函数进行初始化,其正确的初始化方法是:

数据类型 类名::静态数据成员名=值;

[c-sharp] view plaincopy
  1. class foo  
  2. {  
  3. public:  
  4.       foo();  
  5. private:  
  6.       static int i;  
  7. };  
  8.   
  9. int foo::i=20;  
  10. 这表明:  
  11. 1、初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆  
  12. 2、初始化时不加该成员的访问权限控制符privatepublic等  
  13. 3、初始化时使用作用域运算符来表明它所属的类,因此,静态数据成员是类的成员而不是对象的成员。  

 

3、类里的static cosnt 和 const static成员初始化

      这两种写法的作用一样,为了便于记忆,在此值说明一种通用的初始化方法:

  1. class Test  
  2. {  
  3. public:  
  4.       static const int mask1;  
  5.       const static int mask2;  
  6. };  
  7. const Test::mask1=0xffff;  
  8. const Test::mask2=0xffff;  
  9. //它们的初始化没有区别,虽然一个是静态常量一个是常量静态。静态都将存储在全局变量区域,其实最后结果都一样。可能在不同编译器内,不同处理,但最后结果都一样。  

 

这是一个完整的例子:

  1. #ifdef A_H_  
  2. #define A_H_  
  3. #include <iostream>  
  4. using namespace std;  
  5. class A  
  6. {  
  7. public:  
  8.       A(int a);  
  9.       static void print();//静态成员函数  
  10. private:  
  11.       static int aa;//静态数据成员的声明  
  12.        static const int count;//常量静态数据成员(可以在构造函数中初始化)  
  13.        const int bb;//常量数据成员  
  14. };  
  15. int A::aa=0;//静态成员的定义+初始化  
  16. const int A::count=25;//静态常量成员定义+初始化  
  17. A::A(int a):bb(a)//常量成员的初始化  
  18. {  
  19.       aa+=1;  
  20. }  
  21. void A::print()  
  22. {  
  23.       cout<<"count="<<count<<endl;  
  24.       cout<<"aa="<<aa<<endl;  
  25. }  
  26. #endif  
  27. void main()  
  28. {  
  29.       A a(10);  
  30.       A::print();//通过类访问静态成员函数  
  31.       a.print();//通过对象访问静态成员函数  
  32. }  

 

分享到:
评论

相关推荐

    类的static,const,static const,const static成员的初始化

    static,const,static const,const static是c++中几个常见的很容易弄混淆的几个概念,在这里总结了一下,与大家分享!

    C++类中的static和const用法实例教程

    static和const是C++程序设计中非常重要的概念,本文实例列举了C++类中的static和const的规则和用法。供大家参考借鉴。具体说明如下: 首先以代码用来举例说明。示例代码如下: class A { public: A():m(10) //...

    简述C++11就地初始化与列表初始化

    在C++11之前,只能对结构体或类的静态常量成员进行就地初始化,其他的不行。 class C { private: static const int a=10; //yes int a=10; //no } 在C++11中,结构体或类的数据成员在申明时可以直接赋予一个...

    const成员函数、初始化列表、static成员1

    const成员函数、初始化列表、static成员1

    c++ 类中const成员变量的赋值方法

    在头文件的类的定义中定义了一个const成员变量c++ 规则: ...2、将const变量同时声明为 static 类型进行初始化。 Eg: #include class CTestA { public: CTestA():m_iSIZE(20) // method 1 { } ~CT

    关于C++中构造函数初始化成员列表的总结

    3.关于static const是否应该在初始化成员列表中初始化?  static const为全局静态常量,全局的意思是该变量属于整个类而非某个类实例,所以不能再初始化列表中进行初始化。 以上就是小编为大家带来的关于C++中构造...

    C++ 静态成员的类内初始化详解及实例代码

    C++ 静态成员的类内初始化详解及实例代码 一般来说,关于C++类静态成员的初始化,并不会让人感到难以理解,但是提到C++ 静态成员的”类内初始化”那就容易迷糊了。 我们来看如下代码: //example.h #include #...

    static 用法

    (对于C++中的class对象例外, class的对象实例如果不初始化, 则会自动调用默认构造函数, 不管是否是static类型) 特点: static局部变量的”记忆性”与生存期的”全局性” 所谓”记忆性”是指在两次函数调用时, 在...

    新手学习C++入门资料

    C++也可采用格式化输出的方法: #include iostream.h int main() { int a; cout; cin&gt;&gt;a; cout输出十进制数 输出八进制数 ; //输出十六进制数 return 0; } 从上面也可以看出,dec,oct,hex也不可作为...

    C++类的静态成员初始化详细讲解

    但如果静态成员是整型或是枚举型const,则可以在类声明中初始化!!! 代码如下:#include &lt;iostream&gt;using namespace std;class test{public:static int num;};int test::num = 0;void main(){cout&lt;&lt;test::num &lt...

    C++编程思想习题

    16.4.1“最晚辈派生”类和虚基初始化 16.4.2使用缺省构造函数向虚基“警告” 16.5开销 16.6向上映射 16.7避免MI 16.8修复接口 16.9小结 16.10练习 第17章 异常处理 17.1C语言的出错处理 17.2抛出异常 17.3异常捕获 ...

    C++ Primer第四版【中文高清扫描版】.pdf

    3.2.1 string对象的定义和初始化 70 3.2.2 String对象的读写 71 3.2.3 string对象的操作 72 3.2.4 string对象中字符的处理 76 3.3 标准库vector类型 78 3.3.1 vector对象的定义和初始化 79 3.3.2 vector对象的操作 ...

    传智播客_C++基础课程讲义_v1.0.7

    面试题6:虚函数表指针(VPTR)被编译器初始化的过程,你是如何理解的? 6 面试题7:父类的构造函数中调用虚函数,能发生多态吗? c++编译器多态实现原理 6 面试题8:为什么要定义虚析构函数? 6 其他 6 4.3多态...

    C++技术培训.doc

    C++程序设计专题讲座 3 1 第一部分 3 1.1 sizeof 3 1.2 宏 4 1.3 隐式类型转换 5 ...2.5.2 成员初始化列表 38 2.5.3 拷贝构造函数 41 2.5.4 虚析构函数 47 2.5.5 隐藏数据成员 49 2.5.6 单实例对象 54

    xenum:功能齐全的C ++枚举; 从字符串,迭代,枚举集类,类型安全,自定义属性,staticconst(expr)等开始。

    没有运行时初始化/计算,并且在生成的数据中没有指针(对共享库友好)。 类型安全性:基于C ++ 11“枚举类”。 并为每个枚举生成唯一的包装器类。 可以像常规枚举一样放置在类中(除非具有自定义属性,请参见警告...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    5.5.1 字符数组的定义和初始化 5.5.2 字符数组的赋值与引用 5.5.3 字符串和字符串结束标志 5.5.4 字符数组的输入输出 5.5.5 字符串处理函数 5.5.6 字符数组应用举例 *5.6 C++处理字符串的方法——字符串类与字符串...

    C++的概念/解释,可打印,华南师范大学C++考过。

    55. 构造函数为什么要有初始化列表? 12 56. 如何区分++和--的前缀用法和后缀用法的重载函数? 12 57. 类有几个默认的成员函数? 13 58. 什么是抽象类?定义抽象类有什么意义? 抽象类在使用上有什么限制? 13 59. ...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     3.2.1 定义和初始化string对象 76  3.2.2 string对象上的操作 77  3.2.3 处理string对象中的字符 81  3.3 标准库类型vector 86  3.3.1 定义和初始化vector对象 87  3.3.2 向vector对象中添加元素 90  3.3.3 ...

    深度探索模C++对象模型PDF

    2.4 成员们的初始化队伍(Member Initialization List) 第3章 Data语意学(The Semantics of Data) 3.1 Data Member的绑定(The Binding of a Data Member) 3.2 Data Member的布局(Data Member Layout) 3.3 ...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     3.2.1 定义和初始化string对象 76  3.2.2 string对象上的操作 77  3.2.3 处理string对象中的字符 81  3.3 标准库类型vector 86  3.3.1 定义和初始化vector对象 87  3.3.2 向vector对象中添加元素 90  3.3.3 ...

Global site tag (gtag.js) - Google Analytics