const(每个对象中的常量), static const(类的编译时常量)
1 每个对象中的常量 --- const数据成员
const限定,意味着“在该对象生命周期内,它是一个常量”。 关键字const 使被限定的量为常量
在该类的每个对象中,编译器都为其const数据成员分配存储空间。在该类的每个对象中,const数据成员可以取不同的值(可以初始化成不同的值),但是const数据成员的值一旦初始化以后就不能改变。
该初始化工作必须在构造函数里进行
2 类的编译时常量 --- 类的静态常量数据成员
static const
类的一个常量成员,该类的所有对象都只有一个实例,并且在其生命周期中不会改变
3 类的静态数据成员
static限定,意味着“不管类的对象被创建多少次,都只有一个实例”
类的静态数据成员,拥有一块单一的存储空间,而不管创建了多少个该类的对象。所以这些对象的静态数据成员共享一块静态存储空间。
类的静态数据(属于类,不依附于某个对象的存在而存在),所以其不适合在构造函数中初始化。一个静态数据成员其声明在类中,但其定义出现在类型外部,而且只能出现一次,通常放在类的实现文件中
在类A中声明了静态数据成员i;在定义文件中,为静态数据成员定义存储区,并初始化为1
1 #include <iostream> 2 3 class A 4 { 5 static int i; 6 7 public: 8 void func(); 9 10 }; 11 12 int A::i = 1; 13 14 void A::func() 15 { 16 using namespace std; 17 cout<<"i = "<<i<<endl; 18 } 19 20 int main() 21 { 22 A a; 23 a.func(); // i = 1 24 25 return 0; 26 }
如果在定义文件中,没有给静态数据成员i提供定义,那么连接时将产生错误:
Linking... Values.obj : error LNK2001: unresolved external symbol "private: static float Values::sFloat" (?sFloat@Values@@0MA) A.obj : error LNK2001: unresolved external symbol "private: static int A::i" (?i@A@@0HA) Debug/vc_test.exe : fatal error LNK1120: 2 unresolved externals Error executing link.exe. Creating browse info file... vc_test.exe - 3 error(s), 0 warning(s)
例子:
1 #include <iostream> 2 using namespace std; 3 4 class Values 5 { 6 private: 7 8 //普通常量成员(非static的常量成员) 9 const int cSize; //常量成员的初始化,必须在构造函数中进行,每个对象都有,只是成员常量数据在初始化就不能改变 10 11 12 //禁止在类内对"非const的静态成员"进行初始化 13 //static int sFloat = 100; //Values.cpp:8:24: error: ISO C++ forbids in-class initialization of non-const static member ‘Values::sFloat’ 14 static float sFloat; //类的静态成员,所以对象共享同一块内存单元 15 static int sInts[]; 16 17 18 19 static const float scFloat; //类的静态常量成员在类中初始化 20 static const int scInts[]; 21 22 int size; 23 24 public: 25 Values(const int cSize, int sz) : cSize(cSize), size(sz) {} 26 27 void print() const; 28 29 static void printStatic(); 30 }; 31 32 33 //类的普通private成员 34 //int Values::size = 100; //error C2350: 'Values::size' is not a static member 35 36 //类的静态数据成员定义 37 float Values::sFloat = 1.1; 38 int Values::sInts[] = {1, 2, 3}; 39 40 //类静态常量数据成员定义 41 const float Values::scFloat = 100.01; 42 const int Values::scInts[] = {11, 22, 33}; 43 44 //定义一个全局变量size 45 int size = 7; 46 47 48 void Values::print() const 49 { 50 cout<<"::size = "<<size<<endl; 51 cout<<"Values::cSize = "<<cSize<<endl; 52 cout<<"Values::size = "<<size<<endl; 53 cout<<"Values::sFloat = "<<sFloat<<endl; 54 cout<<"Values::scFloat = "<<scFloat<<endl; 55 } 56 57 58 void Values::printStatic() 59 { 60 cout<<"printStatic(), Values::scFloat = "<<scFloat<<endl; 61 cout<<"printStatic(), Values::scInts[] = {"<< scInts[0] <<", " <<scInts[1] << ", " << scInts[2] <<"}"<<endl; 62 63 cout<<"printStatic(), Values::sFloat = "<<sFloat<<endl; 64 cout<<"printStatic(), Values::sInts[] = {"<< sInts[0] <<", " <<sInts[1] << ", " << sInts[2] <<"}"<<endl; 65 } 66 67 68 int main() 69 { 70 Values v(1, 3); 71 72 v.print(); 73 74 Values::printStatic(); 75 76 return 0; 77 }