本文共 2695 字,大约阅读时间需要 8 分钟。
原文地址:
const定义的常量在函数执行之后其空间会被释放,而static定义的静态常量在函数执行后不会被释放其空间。
static表示的是静态的。类的静态成员函数,成员变量是和类相关的,不是和类的具体对象相关,即使没有具体的对象,也能调用类的静态成员函数,成员变量。一般的静态函数几乎就是一个全局函数,只不过它的作用域限于包含它的文件中。在C++中,static静态成员变量不能在类内部初始化。在C++中,const常量成员变量也不能在类定义处初始化,只能通过构造函数初始化列表进行,并且必须有构造函数。const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类声明中初始化const数据成员,因为类的对象未被创建时,编译器不知道const 数据成员的值是什么。const数据成员的初始化只能在类的构造函数的初始化表中进行。要想建立在整个类中都恒定的常量,应该用类中的枚举常量来实现,或者static const。如:class Test{ public: Test():a(0){} enum{size1=100, size2=200};private: const int a; // 只能在构造函数初始化列表中初始化。 static int b; const static int c; // 与static const int c;相同,可以在这里定义(如果以后在类中需要使用该变量的话)。}int Test::b=0; // 不能以成员列表初始化,不能在定义处促使化,因为不属于某个对象。const int Test::c=0;// 注意:给静态成员变量赋值时,不在需要加static修饰。但const要加。const成员函数,主要的目的是防止修改对象的内容。即:int Fun() const;不可以修改对象的数据,可以访问对象的数据,访问成员函数时,只能是const的,不能是non_const的成员函数。static成员函数,主要的目的是作为类作用域的全局函数。不能访问类的非静态数据成员。类的静态成员函数的没有this指针,这导致:1.不能直接存取类的非静态成员变量,调用非静态成员函数2.不能被声明为virtual下面是关于static,const,static const,const static成员的初始化问题。1.类里的const成员初始化:在一个类里建立一个const时,不能给它初值。class foo{ private: const int i = 100; // error !!!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: static int i;public: foo(); ......};int foo::i=100;这表明:(1)初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆。(2)初始化时不加该成员的访问权限控制符private,public等。(3)初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。3.类里的static const 和const static成员初始化: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; // 静态常成员初始化#endifint main() { A a(10); A::print(); // 通过类访问静态成员函数 a.print(); // 通过对象访问静态成员}转载地址:http://zssli.baihongyu.com/