113静态成员 类实际上就是一种用户定义的数据类型。每当生成一个某一类 的对象时,系统就为该对象分配一块内存来存放其所有成员 (从理论上讲,包括所有成员函数)。然而,在实际应用中, 常常希望程序中所有同一类的对象共享某一成员(通常指数据 成员,比如,同一学校中所以学生对象中的学校名称成员) 以保证数据的一致性及简化操作。解决这一问题的一个办法就 是将需要共享的数据说明成全局变量,但这样作将破坏数据的 封装性。更好的解决办法就是将需要共享的成员说明成类中的 静态成员
11.3 静态成员 类实际上就是一种用户定义的数据类型。每当生成一个某一类 的对象时,系统就为该对象分配一块内存来存放其所有成员 (从理论上讲,包括所有成员函数)。然而,在实际应用中, 常常希望程序中所有同一类的对象共享某一成员(通常指数据 成员,比如,同一学校中所以学生对象中的学校名称成员), 以保证数据的一致性及简化操作。解决这一问题的一个办法就 是将需要共享的数据说明成全局变量,但这样作将破坏数据的 封装性。更好的解决办法就是将需要共享的成员说明成类中的 静态成员
113.1静态数据成员 静态数据成员是指在类中说明的、用关键字 static修饰的数据 成员。例: class x I static int S;、∥引用性说明 t X, s ∥定义性说明 在类中说明的静态成员属于引用性说明,必须在类外对其进 定义性说明(说明时还可以对其进行初始化,定义性说明时不 得带关键字 static)。所以需要这样做是因为静态成员不属于 任何一个对象,而为所有同类对象所共享
11.3.1 静态数据成员 静态数据成员是指在类中说明的、用关键字 static 修饰的数据 成员。例: class X { int d; static int s; // 引用性说明 //… }; int X :: s; // 定义性说明 在类中说明的静态成员属于引用性说明,必须在类外对其进行 定义性说明(说明时还可以对其进行初始化,定义性说明时不 得带关键字 static)。所以需要这样做是因为静态成员不属于 任何一个对象,而为所有同类对象所共享
∥ SDCLS.H class x t nt d static int n Count: public X(int a=0): d(a)t nCount ++ y 0 n Count void Set(int a d=a;} int Geto return d Counto return nCount int X:: nCount =0
// SDCLS.H class X { int d; static int nCount; public: X(int a = 0) : d(a) { nCount ++; } ~X() { nCount --; } void Set(int a) { d = a; } int Get() { return d; } int Count() { return nCount; } }; int X :: nCount = 0;
∥/ TSDCLS. CPP include include sdcls. h void maino ⅩXArr3],ax(100); for(=0;i<3;i+) XArr[ Set(i*i) for(=0;i<3;i++) cout << XArrl"<<i<<"].d="<<XArr[]. Get( <<It
// TSDCLS.CPP #include #include "sdcls.h" void main() { X xArr[3], aX(100); int i; for(i = 0; i < 3; i ++) xArr[i].Set(i * i); for(i = 0; i < 3; i ++) cout << "xArr[" << i << "].d = " << xArr[i].Get() << '\t';
cout < XArr["<<i<< ]. n Count ="< XArr[]. Counto < endl cout < axd="<< aX. Get(<<It cout <<axnCount =" <<aX Counto<< endl; 该程序的输出为: XArr[O]. d =0 XArr[o]. nCount= 4 XArr[1].d=1 XArr[1].nCount 4 XArr[2]. d =4 XArr[2]. nCount =4 ax.d=100 aX. n count 4
cout << "xArr[" << i << "].nCount = " << xArr[i].Count() << endl; } cout << "aX.d = " << aX.Get() << '\t'; cout << "aX.nCount = " << aX.Count() << endl; } 该程序的输出为: xArr[0].d = 0 xArr[0].nCount = 4 xArr[1].d = 1 xArr[1].nCount = 4 xArr[2].d = 4 xArr[2].nCount = 4 aX.d = 100 aX.nCount = 4
从上例的输出可以看出:无论哪个对象,其成员 nCount的值 均是相同的。实际上,所有对象中的该成员根本就是同一个变 量 本例中该变量的值为4是类定义和所创建的对象个数所决定 的:这里将 nCount设计成了一个对象计数器,其初值为0 每创建一个对象其值就加一(参见类X的构造函数);而每 当一个对象被撤消其值就减一(参见类X的析构函数)。 由于 n Count是一个所有X类对象共享的数据成员,从理论上 讲它不属于任何一个对象。因此,对该成员的访问以如下的形 式进行将显得更为合理: n=∷ Counto; cout <<X: Count( < endl
从上例的输出可以看出:无论哪个对象,其成员 nCount 的值 均是相同的。实际上,所有对象中的该成员根本就是同一个变 量。 本例中该变量的值为 4 是类定义和所创建的对象个数所决定 的:这里将 nCount 设计成了一个对象计数器,其初值为 0。 每创建一个对象其值就加一(参见类 X 的构造函数);而每 当一个对象被撤消其值就减一(参见类 X 的析构函数)。 由于 nCount 是一个所有 X 类对象共享的数据成员,从理论上 讲它不属于任何一个对象。因此,对该成员的访问以如下的形 式进行将显得更为合理: n = X :: Count(); cout << X :: Count() << endl;
11.32静态成员函数 与静态数据成员相同,静态成员函数是类中说明的、用关键字 static修饰的成员函数。 般讲,若类中存在静态数据成员,则访问该数据成员的成员 函数应当说明成静态的。以便为共享的数据提供共享的接口 应当说明的是: 1.由于关键字 static不是数据类型的组成部分,所以在类外 定义静态成员函数时不需要该关键字。 2.由于静态成员函数没有ths指钋,所以对于那些需要访问 类中其它非静态成员的静态成员函数,必须带有一个同类对象 或引用参数。 3.静态成员函数只能访问类中的静态数据成员(除非函数带 有相应的参数),而非静态成员函数则可以访问类中的任何成 员
11.3.2 静态成员函数 与静态数据成员相同,静态成员函数是类中说明的、用关键字 static 修饰的成员函数。 一般讲,若类中存在静态数据成员,则访问该数据成员的成员 函数应当说明成静态的。以便为共享的数据提供共享的接口。 应当说明的是: 1. 由于关键字 static 不是数据类型的组成部分,所以在类外 定义静态成员函数时不需要该关键字。 2. 由于静态成员函数没有 this 指针,所以对于那些需要访问 类中其它非静态成员的静态成员函数,必须带有一个同类对象 或引用参数。 3. 静态成员函数只能访问类中的静态数据成员(除非函数带 有相应的参数),而非静态成员函数则可以访问类中的任何成 员
H SFCLSH class x I int d static int nCount public X(int a=0): d(a) n Count + ~×0 n Count void Set(int a) d=a;} int Geto return d static int Counto I return nCount int X,. nCount =0
// SFCLS.H class X { int d; static int nCount; public: X(int a = 0) : d(a) { nCount ++; } ~X() { nCount --; } void Set(int a) { d = a; } int Get() { return d; } static int Count() { return nCount; } }; int X :: nCount = 0;
∥/ TSFCLS. CPP include #include sfcs. h 程序的输出为: 0 void maino aXd=1001 cout <<X: Count( < endl Xax(100); cout <<aX. d ="<<aX. Get(<<'It<<X: Count( < endl
// TSFCLS.CPP #include #include "sfcls.h" void main() { cout << X :: Count() << endl; X aX(100); cout << "aX.d = " << aX.Get() << '\t' << X :: Count() << endl; } 程序的输出为: 0 aX.d = 100 1
114 const, volatile对象和成员函数 对象 key word class name obj name, 函数 type func name( arg list) key word; 其中: key word或者是 const,或者是 volatile。用前者修饰 的对象或成员函数叫做 const(常)对象或成员函数;用后者 修饰的对象或函数叫做 volatile(易变入对象或成员函数。通 过常对象只能访问类中的常成员函数;通过易变对象只能访问 类中的易变成员函数。 由于易变对象和成员函数很少使用,下而仅举例说明常对象和 成员函数的作用
11.4 const,volatile 对象和成员函数 对象 key_word class_name obj_name; 函数 type func_name() key_word; 其中:key_word 或者是 const,或者是 volatile。用前者修饰 的对象或成员函数叫做 const(常)对象或成员函数;用后者 修饰的对象或函数叫做 volatile(易变)对象或成员函数。通 过常对象只能访问类中的常成员函数;通过易变对象只能访问 类中的易变成员函数。 由于易变对象和成员函数很少使用,下而仅举例说明常对象和 成员函数的作用