C++类中的static数据成员和static成员函数

引言

   在看C++源码中,我们经常会看到在类中定义的static数据成员,以及static成员函数。这时我们不禁会想:
  • 为什么要这样?(why)
  • 代表什么含义?(what)
  • 怎样使用他们?(how)

    ok!接下来我么就围绕这三个问题来谈谈!!

Why

  举个例子:假如我们定义了一个类Student,在我们使用这个类的时候,我想知道这个类一共被我们实例化了多少次,该怎么做呢?这时候就用到了static数据成员了。如果我们将static数据成员的访问权限设计成private或protected,在非子类中进行类的解析访问static数据成员是不允许的,所以我们需要引入ststic成员函数。
  其实static成员的好处还有很多,这里我们就不一一列举了。

What

 C++Primer里面讲过:static成员不像普通的成员函数,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类相关,并不与该类的对象相关!!这句话可能乍一听比较难理解,我们可以这么理解:static成员是跟类相关,而与类实例化的对象不相关。这是为什么呢?我们可以从内存分配的角度去理解,static数据成员是在程序的静态存储区分配内存的,而类中的非静态数据成员则是在栈空间上分配。
 我们再来看static成员函数,上面说过static数据成员独立于该类的任意对象而存在,因此,static成员函数没有this指针。而对于一般的成员函数,具有一个附加的隐含参数,即指向该类对象的一个this指针。因为static成员函数不含this指针,所以它就不能调用类的非静态数据成员,但它可以直接访问static数据成员。

How

 接下来我们来讨论如何使用的问题:
 既然是static数据成员,所以关键字static是必不可少的,例如:
static.h文件
 2 #include  <iostream>
 3 #include  <string>
 4 using namespace std;
 5 class Person
 6 {
 7 private:
 8     string name;
 9     static int age;
10 public:
11     Person(const string&nm):name(nm)
12     {}
13     void Print()
14     {
15         cout<<name<<" is "<<age<<endl;
16     }
17 };
18 int Person::age=20;
static.cpp文件
21 
22 #include "stdafx.h"
23 #include "static.h"
24 #include <iostream>
25 using namespace std;
26 
27 int _tmain(int argc, _TCHAR* argv[])
28 {    
29     Person person("tom");
30     person.Print();
31     cout<<endl;
32     return 0;
33 }

这里我们注意以下几点:

  1. 类中不能对static数据成员初始化,必须在类外定义(static数据成员实际上是类域中的全局变量)
  2. static数据成员不是通过类的构造函数初始化。
  3. 如果类中有多个static数据成员,static数据成员的初始化按照类中定义的顺序进行初始化。
  4. static数据成员被所有类共享,包括派生类的对象

具体的使用参见:
http://blog.csdn.net/pamchen/article/details/8632442

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值