类static成员引进:有时特定类的全体对象需要访问一个全局对象。
★为什么用static成员而不是全局对象?
---- static对象名字在类作用域中,可以有效避免命名冲突,并且清晰显示程序意图。
---- 可以实施封装(static成员可以定义为private,而全局对象不可以)
★如何调用? ---- class A a; A::static_mem; a.static_mem;
★声明和定义
---- static成员函数在类定义体内部外部定义均可。在类定义体外定义时不加(不可以加)static修饰。
---- static数据成员必须在类定义体外部定义(正好一次)(在类定义体外声明并定义)
class A{public : static int n;} int A::n = 10;
---- const static数据成员可以(也可以不)在类定义内初始化,但必须在类定义体外部重新声明(不可以加static修饰符,不可以赋初值)
★static数据成员其他特性:
----一般地,在类的内部不能有该类类型的变量(或函数形参),最多只能有该类类型的指针或引用做变量类型(或函数形参). static数据成员则不受这个限制。
---- 类的static数据成员可以作为函数默认实参
---- static成员的继承:如果基类有static成员,则整个继承层次中只有一个这样的成员。每个static成员总是只有一个实例。
1#include <iostream>
2#include <cstdlib>
3
4using namespace std;
5
6class A
7{
8 //重载输出操作符
9 friend ostream& operator<<(ostream& out, const A&a)
10 {
11 out << a.m;
12 return out;
13 }
14
15private:
16 int m ;
17
18public:
19 A(int i) { m = i;}
20
21 static int n;
22
23 static A a; //类可以有该类类型的static成员
24 //A a1; //error. 类不可以有普通的该类类型的成员
25
26 static void func(A a) {cout << a << endl;} //类类型可以作为该类static函数的形参
27
28 //static 数据成员可以作为类成员函数的默认实参
29 static void func2(int i = n) { cout << i*i <<endl;}
30};
31
32int A::n = 10;
33A A::a(1);
34
35int main()
36{
37 cout << A::n << endl; //10
38 cout << A::a <<endl; //1
39
40 A a2(3);
41 A::func(a2); //3
42 A::func2(); //100
43
44 system("pause");
45 return 0;
46}
2#include <cstdlib>
3
4using namespace std;
5
6class A
7{
8 //重载输出操作符
9 friend ostream& operator<<(ostream& out, const A&a)
10 {
11 out << a.m;
12 return out;
13 }
14
15private:
16 int m ;
17
18public:
19 A(int i) { m = i;}
20
21 static int n;
22
23 static A a; //类可以有该类类型的static成员
24 //A a1; //error. 类不可以有普通的该类类型的成员
25
26 static void func(A a) {cout << a << endl;} //类类型可以作为该类static函数的形参
27
28 //static 数据成员可以作为类成员函数的默认实参
29 static void func2(int i = n) { cout << i*i <<endl;}
30};
31
32int A::n = 10;
33A A::a(1);
34
35int main()
36{
37 cout << A::n << endl; //10
38 cout << A::a <<endl; //1
39
40 A a2(3);
41 A::func(a2); //3
42 A::func2(); //100
43
44 system("pause");
45 return 0;
46}