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

来源:互联网 发布:重装系统桌面数据恢复 编辑:程序博客网 时间:2024/05/17 22:31

一、static 成员变量

对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量。比如说统计某种类型对象已创建的数量。如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量,这时可以用类的静态成员来解决这个问题。C++primer里面讲过:static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联!static数据成员是存储在程序的静态存储区,而并不是在栈空间上。使用时的注意总结如下:

(1)static成员变量只能在类内声明,在类外进行初始化

由于static数据成员是与类关联的对象不能通过类构造函数在类内进行初始化的!所以,必须只能在类内声明,在类外进行初始化。如果类中有多个static数据成员,static数据成员初始化的次序是按照static数据成员在类中的声明次序进行初始化的。

(2)特殊的整型staticconst成员(一定只能是int型,换成string ,double都不行)可以在类内初始化

整型static const成员可以在类内初始化,该成员可以不在类体外进行定义(可选的)。

(3) static成员变量可以被任何成员函数访问

(4)static成员优点:

static成员的名字是在类的作用域中,因此可以避免与其它类成员或全局对象名字冲突。可以实施封装,static成员可以是私有的,而全局对象不可以阅读程序容易看出static成员与某个类相关联,这种可见性可以清晰地反映程序员的意图。

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


 

Person类中定义了一个static数据成员age,注意在类中不能对static数据成员进行初始化,要初始化的话必须在类外进行定义!在类外定义int Person::age=20;这里前面就不要再加static了。只有age才能在类定义体内进行初始化,address是不行的。

二、static 成员函数

(1)static成员函数没有隐含的this指针

一般而言,类中的成员函数具有一个附加的隐含实参,即指向该类对象的一个指针。这个隐含实参命名为this。因为static成员函数不是任何对象的组成部分,所以static成员函数就没有this形参了。

(2)static成员函数不能声明为const

因为static成员函数不是任何对象的组成部分,又由于由于成员函数声明为const说明该成员函数不会修改该成员函数所属的对象,所以static成员函数不能声明为const。
(3)static成员函数不可以访问非static成员和static const 类型的成员

如果static成员函数中要引用非静态成员时,可通过对象来引用。因为对象是一个实实在在的东西,通过对象来引用非static数据成员,该数据成员只属于他的对象,不会是别的对象。但是如果直接使用,static成员函数并不知道一个非static数据成员到底是从哪里来,属于那个对象(一个类可以有多个对象,当然对于sington的实现例外),所以static成员函数中不能直接操作类中的非static数据成员。

在上面的代码中static  string Address()函数中如果是return name或者是return age都不行!

 


原创粉丝点击