const(每个对象中的常量), static const(类的编译时常量)

时间:2021-10-25 08:37:10

 

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 }