重温C++ primer 之C++类中的static数据成员,static成员函数

转载 2012年03月29日 14:36:07
C++类中谈到static,我们可以在类中定义static成员,static成员函数!C++primer里面讲过:static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联!这句话可能比较拗口,其实可以这么理解:每个static数据成员可以看成是类的一个对象,而不与该类定义的对象有任何关系!下面我们就来具体看看类中的static数据成员!

      谈到数据成员,我们最先想到的应该是怎么去定义一个static数据成员,static数据成员是存储在程序的静态存储区,而并不是在栈空间上。既然是static数据成员,所以关键字static是必不可少的,例如:

  

 1 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;
19 
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 }

Person类中定义了一个static数据成员age,注意在类中不能对static数据成员进行初始化,要初始化的话必须在类外进行定义!注意,static数据成员不是通过类构造函数进行初始化的!如上面的代码所示:在类外定义int Person::age=20;这里前面就不要再加static了。如果类中有多个static数据成员,static数据成员初始化的次序是按照static数据成员在类中的声明次序进行初始化的,初始化了之后,就可以使用static数据成员了,我们可以通过作用域操作符从类直接调用static数据成员,或者通过对象,引用,或指向该类类型对象的指针间接调用(这种情况下static数据成员必须是public的访问权限,如果定义在private访问权限下是不行的)。

     说到static数据成员,有一种情况不得不提,那就是特殊的const static成员。如上面所述,类的static成员,像普通数据成员一样,不能在类的定义体中进行初始化。只能在类外进行初始化。const int 型的static成员便可以在类定义体内部进行初始化。记住一定只能是const int型的,换成const string ,double都不行的。看下面这段代码:

static.h头文件
#include  <iostream>
#include  <string>
using namespace std;
class Person
{
private:
    string name; 
    static const int age=20;
    static string address;
public:
    Person(const string&nm):name(nm)
    {}
    static string Address()
    {
        return address;
    }
    void Print()
    {
        cout<<name<<" is "<<age ;
    }
};
string Person::address="Beijing";

static.cpp文件

#include "stdafx.h"
#include "static.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{    
    Person person("tom");
    person.Print();
    cout<<" and live in "<<person.Address();
    cout<<endl;
    return 0;
}

只有age才能在类定义体内进行初始化,address是不行的。这段代码不能在VC6.0上运行的,它不支持。在vs2008上可以运行。在C++Primer里面有一段注解:const static数据成员在类的定义体中进行了初始化后,还必须在类的定义体之外进行定义。其实这是可要可不要的。上面的代码就没有这段代码实现,其实加上去也是可以的,没有关系。还有一点,static数据成员的类型可以使该成员所属的类类型,非static数据成员被限定为其自生类对象的指针或引用。例如:类定义位如下的情况:

按 Ctrl+C 复制代码

如果没有定义person3,则能够顺利通过编译,但是加上了person3就不能通过编译了!

      说完了static成员后,我们再来看看static成员函数,static成员是类的组成部分并不是任何对象的组成部分,因此,static成员函数没有this指针。我们知道,一般而言,类中的成员函数具有一个附加的隐含实参,即指向该类对象的一个指针。这个隐含实参命名为this。因为static成员函数不是任何对象的组成部分,所以static成员函数就没有this形参了。由于成员函数声明为const说明该成员函数不会修改该成员函数所属的对象,所以static成员函数不能声明为const。为什么呢?因为static成员函数不是任何对象的组成部分。static成员函数可以直接访问所属类的static成员,但是不能直接使用非static成员函数!也不能访问static const 类型的成员!在上面的代码中static  string Address()函数中如果是return name或者是return age都不行!

可以看下地址:

C/C++ code
#include<iostream>

using namespace std;

class A
{
public:
    A(int i = 0) : i(i){}
    static A a;
    int i;
};

A A::a = A();

int main()
{
    A a;
    
    cout<<&(a.a)<<endl;
    cout<<&(a.a.a)<<endl;
    cout<<&(a.a.a.a)<<endl;
        
    cout<<&(A::a)<<endl;
    cout<<&(A::a.a)<<endl;
    cout<<&(A::a.a.a)<<endl;
    
    system("pause");
    return 0;
}

上述代码还没发现实用的价值,有人知道用在什么情况下吗?
 

C++static类成员,static类成员函数

1.static类成员 在C++primer里面说过,static类成员不像普通的类数据成员,static类数据成员独立于一切类对象处在。static类数据成员是与类关联的,但不与该类定义的对象有任何...
  • u014453898
  • u014453898
  • 2017年03月20日 14:33
  • 1115

C++static静态成员函数

静态成员函数   静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名。   在静态成员函数的实现中不能直接引用类中说明的非静态...
  • pamchen
  • pamchen
  • 2013年03月04日 09:44
  • 22606

C++类中的静态数据成员--static

使用静态成员的目的是为了解决数据共享的的问题。
  • lanzhihui_10086
  • lanzhihui_10086
  • 2014年09月08日 17:32
  • 2376

C/C++---static函数,static成员函数,static变量,static成员变量 再来理一理

首先说一下内存的五个区: 栈(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值(除static),其操作方式类似于数据结构中的栈。 堆(heap):一般由程序员分配释放,若程序员不...
  • FreeApe
  • FreeApe
  • 2016年03月25日 14:23
  • 1921

C++ 静态成员和静态成员函数

在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。使用惊涛成员变量可以实现多个对象之间的数据共享而不会破坏隐藏的原则, 保证了安全性还可以节省内存。    静...
  • LinuxIPLinux
  • LinuxIPLinux
  • 2015年04月20日 08:14
  • 901

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

C++类中谈到static,我们可以在类中定义static成员,static成员函数!C++primer里面讲过:static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在,...
  • u010442009
  • u010442009
  • 2013年10月12日 11:15
  • 634

C++回顾之static成员、static成员函数及类对象大小计算

static静态数据成员,static静态成员函数,static静态常量数据成员,类大小的计算原则等...
  • ab198604
  • ab198604
  • 2014年02月08日 10:14
  • 2652

关键字static的作用是什么? C++类中的静态成员变量和静态成员函数的作用

本文转自《面试宝典》 1,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时,仍维持上次的值;...
  • taotaoah
  • taotaoah
  • 2016年10月17日 22:12
  • 1576

c++类成员函数

c++的两大特色是多态和模板。其中多态是通过继承和虚函数来实现的,其中虚函数是通过每个对象里面的虚表来实现的。如果这个对象的类有虚函数,那么这个类就有一张虚表,存的是每个虚函数的入口地址,而这个类的每...
  • yuanyirui
  • yuanyirui
  • 2009年09月25日 17:04
  • 9574

C++中类的成员函数作为 pthread_create的线程函数

在C++的类中,普通成员函数作为pthread_create的线程函数就会出现参数问题,因为其不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是...
  • hsd2012
  • hsd2012
  • 2016年04月21日 11:42
  • 2849
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:重温C++ primer 之C++类中的static数据成员,static成员函数
举报原因:
原因补充:

(最多只允许输入30个字)