修身养性,止于至善___leiming32的博客

关于c++中类的static成员总结

test_staticmember.h
 1#include <iostream>
 2using namespace std;
 3
 4class A
 5{
 6public:
 7    static double m_rate; // 非const的static成员变量,在cpp文件中声明并定义(初始化),因为这里是声明,
 8                            // 没有分配空间,不能初始化
 9    const static int m_ival; // 只有静态常量整型数据成员才可以在类中初始化. (最好在类外初始化,cpp后面有总结)
10    //const static double m_dval = 3.3; //error
11    const static double m_dval;
12
13    static A a; // ok 类可以有该类类型的static成员
14            /*    在类的内部不能有该类类型的变量(或函数形参),最多只能有该类类型的指针或引用做变量类型(或函数形参)  
15                static数据成员则不受这个限制。
16            */

17
18    static void run();
19    
20    void run2(double d = m_rate) //static数据成员可以作为类成员函数的默认实参
21        cout << "run2: static数据成员可以作为类成员函数的默认实参" << endl;
22    }

23}
;

test_staticmember.cpp
 1#include <iostream>
 2#include "test_staticmember.h"
 3using namespace std;
 4
 5
 6const int A::m_ival = 232// 如果在类体中初始化, 又在cpp中定义, 报重复定义错,如果没有在类中初始化,则不报错
 7double A::m_rate = 2.1// 前面不能加static 
 8const double A::m_dval = 2.2// 必须加const,否则:重定义_不同的类型修饰符, 不可以加static
 9
10
11void A::run() // 类的static成员函数,类中类外定义均可,在类外定义时不能加static
12    cout << "A run" << endl;
13}

14
15void global_func1()
16{
17    static int ival = 1// 只执行一次
18    cout << ival << endl;
19    ++ival;
20}

21void global_func2()
22{
23    static int ival;
24    ival = 1;
25    cout << ival << endl;
26    ++ival;
27}

28
29
30int main()
31{
32    A::m_rate = 4.4// m_rate要public才行. 引出如下
33        /*
34            ★为什么用static成员而不是全局对象?
35       ---- static对象名字在类作用域中,可以有效避免命名冲突,并且清晰显示程序意图。
36       ---- 可以实施封装(static成员可以定义为private,而全局对象不可以)
37        */

38
39    cout << "A::m_iva = " << A::m_ival << ",不用在外部重新声明就可以用" << endl;
40    (new A)->run2();
41
42    // 调用两次global_func
43    cout << "\n调用两次global_func" << endl;
44    global_func1(); global_func1(); // 1 2
45    global_func2(); global_func2(); // 1 1
46
47    return 0;    
48}

49
50/*
511. static成员的继承:如果基类有static成员,则整个继承层次中只有一个这样的成员。每个static成员总是只有一个实例
522. 如果是模板中使用非const的static的变量..那需要根据具体类型初始化。
533. 对于m_ival
54    如果在类中定义并初始化,且在test_staticmember.cpp中声明(不赋值),在程序包含test_staticmember2.cpp的情况下
55    报重复定义错; 如果在类中不初始化,而在test_staticmember.cpp中初始化,包含test_staticmember2.cpp的情况下运
56    行成功。
57    
58    最后总结,感觉const static int的类成员变量与const static double的类成员变量一样,类中声明类外初始化定义,不
59    会有麻烦
60*/

test_staticmember2.cpp
1#include "test_staticmember.h"

================================================================================================
补充(2010.6.13 世界杯第二天,韩国2-0完胜希腊,英格兰1-1惜平美国,阿根廷1-0小胜尼日利亚)
如果要在产生任何对象之前调用类的私有static成员变量,则必须通过static的成员方法。static成员方法没有this指针,因此它不能处理类中的非static成员变量。(来自《深入浅出MFC》p72)

posted on 2010-06-12 16:56 狼在北方 阅读(352) 评论(0)  编辑 收藏 引用 所属分类: C++编程语言