`
BlogDown
  • 浏览: 223979 次
  • 性别: 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成员的初始化

    在 C++ 编程中,static、const、static const 和 const static 是四个常见的概念,但它们的初始化方式却容易弄混淆。下面我们将对这四种成员变量的初始化方式进行总结和解释。 1. 类里的 const 成员初始化 在一个...

    const与static用法完整总结

    `const`和`static`都是C++中非常重要的关键字,合理使用它们可以增加代码的安全性和效率。`const`用于标记不可变的数据或行为,而`static`则用于表示全局或静态作用域的数据或函数。正确理解并掌握它们的使用方法...

    C++ 中 const和static readonly区别

    C++ 中 const 和 static readonly 是两种不同的关键字,它们都用于修饰变量或字段,但是它们之间存在着本质的区别。 首先,const 是一个编译时常量,它的值是在编译期间确定的,因此只能在声明时通过常量表达式指定...

    C++全局变量初始化的一点总结

    静态初始化发生在程序加载时,主要针对那些可以用常量表达的初始化,例如零初始化(zero initialization)和常量初始化(const initialization)。零初始化的变量通常存放在BSS段,而常量初始化的变量则位于数据段,...

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

    C++ 编程语言中,const 成员函数、初始化列表、static 成员变量是三个重要的概念,它们在编程中发挥着重要的作用。 const 成员函数 在 C++ 中,const 成员函数是指不能修改对象的状态的成员函数。这些函数的this...

    const,extern,static,volatile的使用

    - **局部变量**:如果在一个函数中定义了一个局部变量并加上 `static`,那么这个变量在整个程序运行期间都存在,并且其初始值只会被初始化一次。 **2. static 函数** - **限制作用域**:在一个文件中定义了带有 `...

    C++类成员和数据成员初始化总结

    总结来说,C++中的类成员和数据成员初始化是一个严谨的过程,需要理解构造函数的机制,以及`const`、`static`和数组的特殊性。正确初始化成员可以确保对象的有效性和代码的健壮性。遵循这些规则,可以帮助我们编写出...

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

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

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

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

    C++中static关键字总结

    C++中的static关键字是一个非常重要的概念,它在不同的上下文中有不同的含义和用途。在C++中,使用static关键字可以修饰变量和函数,具有不同的作用。下面对这些知识点进行详细解释。 首先,静态变量(static ...

    constt文档

    `const`修饰的成员变量必须在初始化列表中进行初始化,因为它们不能在类的构造函数体中直接赋值。例如: ```cpp class Test1 { private: int a = 10; const int b = 10; // 错误,不能在类中直接初始化 const ...

    const extern static volatile 小结

    - 使用 `const` 定义的常量必须在定义时初始化。 - 对于数组和字符串等复合数据类型,`const` 的用法需要特别注意,以确保正确地限定数据的可变性。 #### 二、Extern(外部声明) `extern` 关键字用于声明一个...

    const和static

    在C/C++编程语言中,`const`和`static`是两个重要的关键字,它们各自有着特定的作用。`const`用于声明常量或只读变量,而`static`则用于控制变量的作用域和生命周期。 `const`关键字用于创建不可修改的变量。这意味...

    C++中static要点总结

    在C++中,`static`关键字还可以用来修饰局部变量和全局变量,以改变它们的存储位置和生命周期。 **局部变量:** 1. **存储位置:** 使用`static`修饰的局部变量存储在静态数据区,而非栈区。 2. **生命周期:** `...

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

    总之,C++类的静态成员初始化需要根据其类型和const属性来确定初始化的位置。整型和枚举型const静态成员可以直接在类声明中初始化,而其他类型的静态成员则需要在类声明之外初始化,并使用作用域解析运算符指定所属...

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

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

    C/C++中static,const,inline三种关键字详细总结

    在C/C++编程语言中,`static`, `const`, 和 `inline` 是三个非常关键的关键字,它们各自都有独特的用途和功能。下面我们将逐一深入探讨这三个关键字的详细概念和应用。 **一、关于`static`** `static` 关键字主要...

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

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

    c++关键字分析

    在深入探讨C++中的`const`与`static`关键字及其链接属性之前,我们先来简要回顾一下这两个关键字的...通过上述讨论,我们可以看到,合理运用`const`、`static`以及它们的链接属性,能够显著提升代码的可靠性和效率。

Global site tag (gtag.js) - Google Analytics