const, static, const static
来源:互联网 发布:unity3d真机调试 编辑:程序博客网 时间:2024/04/25 16:38
const定义的常量在函数执行之后其空间会被释放,而static定义的静态常量在函数执行后不会被释放其空间。
static 表示的是静态的。类的静态成员函数,成员变量是和类相关的,不是和类的具体对象相关,即使没有具体的对象,也能调用类的静态成员函数,成员变量。一般的静态函数几乎就是一个全局函数,只不过它的作用域限于包含它的文件中。
在c++中,static静态成员变量不能在类内部初始化。
在c++中,const常量成员变量也不能在类定义处初始化,只能通过构造函数初始化列表进行,并且必须有构造函数。
const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类声明中初始化const数据成员,因为类的对象未被创建时,编译器不知道const 数据成员的值是什么。
const数据成员的初始化只能在类的构造函数的初始化表中进行。要想建立在整个类中都恒定的常量,应该用类中的枚举常量来实现,或者static const。
1.类里的const成员初始化:
在一个类里建立一个const时,不能给它初值。像
class foo
{
private:
const int i = 100; // error !!!
public:
foo(){}
......
};
2.类里的static成员初始化:
类中的static变量是属于类的,不属于某个对象,它在整个程序的运行过程中只有一个副本,因此不能在定义对象时对变量初始化,就是不能用构造函数来初始化。其正确的初始化方式是:
<数据类型><类名> ::<静态数据成员名> = <值> ,例如
class foo
{
private:
static int i;
public:
foo();
......
};
int foo ::i = 100;
这表明:
(1)初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆。
(2)初始化时不加该成员的访问权限控制符private,public等。
(3)初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。
3.类里的static const 和const static成员初始化:
在借阅《Thinking in c++》中文版188页和做了相关实验后,我认为若在类内使用的话,static const 则必须在static const 定义之处进行初始化(笔者加:旧的编译器不允许static成员在其声明式上获得初值,新的可以。除此之外,还要注意在声明时初始化没有分配空间,如下:
class Test{
public:
static const int MASK1 = 0xFFFF; //这是声明式,没有分配空间。
...
};
)。其他情况在类里外都行。比如:
class Test{
public:
static const int MASK1;
const static int MASK2;
};
const int Test ::MASK1 = 0xFFFF;
const int Test ::MASK2 = 0xFFFF;
它们没有区别,虽然
一个是静态常量,
一个是常量静态,
静态都将存储在全局变量区域,其实最后结果都是一样的。
可能在不同编译器内,不同处理,但是最后结果是一样的。
下面是一个完整的例子:
#ifndef A_H_
#define A_H_
#include<iostream>
using namespace std;
class A{
private:
static int aa; //静态数据成员声明
static const int count; //静态常数据成员声明(可以在此初始化)
const int bb; //常数据成员
public:
A(int a);
static void print(); //静态成员函数
};
A::A(int a):bb(a) { //常成员的初始化
aa += 1;
}
void A::print() {
cout << "connt=" << count<< endl;
cout << "aa=" << aa << endl;
};
int A::aa = 0; //静态成员定义
const int A::count = 25; //静态常成员初始化
#endif
int main(){
A a(10);
A::print(); //通过类访问静态成员函数
a.print(); //通过对象访问静态成员
}
但是注意:将static const datamember的申明放在头文件中时,新的C++标准支持,但VC6.0却不支持。
本文转载自http://hi.baidu.com/sytarchen/item/c7cc767968b5ee3471442342
- const, static, const static
- const static 与static const const static
- const、static
- Static & const
- const static
- static const
- const&static
- static /const
- const & static
- static const
- static const
- const static
- static const
- Static Const
- static const、static、const成员
- static、const和static const
- static、const、static const比较
- static、const和static const
- 一个程序员的失恋故事
- [Coursera]计算机组成_Week3_Mips_Q2
- hdu1231 最大连续子序列--DP
- Http协议与TCP协议简单理解
- Qt:关于Qt5.6安装包无法运行的解决方法
- const, static, const static
- 从业务建模开始
- 大数据量高并发访问的数据库优化方法
- 创建第一个Spring MVC程序helloworld
- 公告 我的另外一个博客
- 别傻了,人家离职你也离
- Flexpaper播放swf的问题
- JavaScript
- Java单例你所不知道的事,与Volatile关键字有染