首页 > 编程语言 > 详细

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

时间:2015-09-12 12:08:47      阅读:197      评论:0      收藏:0      [点我收藏+]

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

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

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

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<<endl;
    return 0;
}

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数据成员被限定为其自生类对象的指针或引用。例如:类定义位如下的情况:

class Person
{
private:
    string name; 
    static const int age=20;
    static string address;
    static Person person1;
    Person *person2;
    Person person3;
public:
    Person(const string&nm):name(nm)
    {}
    static string Address()
    {
        return address;
    }
    void Print()
    {
        cout<<name<<" is "<<age ;
    }
};

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

原文:http://www.cnblogs.com/yyxt/p/4802688.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!