《面向对象程序设计 C++》类数据成员和类成员函数

类数据成员

C++类中有一种类型成员,属于类本身,而不属于类的对象,这种类型成员成为类成员,而属于对象的成员成为对象成员实例成员。可以使用关键字static来创建一个类成员。

static声明与定义

class C
{
public:
    //...
private:
    static unsigned n;
    //...
};
unsigned C::n=0; //在外部定义时不需要加static

在类声明内部声明的static数据成员必须在任何程序块之外定义。通过外部定义将C::n初始化为0,但这不是必须的,因为在创建第一个对象时,所有的静态数据都会被初始化为零,除非提供一个不同的初值。并且在类体外定义的,不必使用static
static数据成员不会影响该类及其对象的sizeof

#include<iostream>
using namespace std;
class C
{
public:
    int a;
    unsigned long b;
    //...
private:
    //static unsigned n1; //does not impact sizeof(C)
    //static unsigned n2; //does not impact sizeof(C)
    //...
};
int main()
{
    cout<<sizeof(C)<<endl;
    C c1;
    cout<<sizeof(c1)<<endl;
    return 0;
}

类成员函数

除了static数据成员,类还可以有static成员函数。静态成员函数只能访问其他的static成员,包括数据成员和成员函数。

class C
{
public:
    static unsigned getN()
    {
        setST(); //ERROR:not static!
        return n;
    }
private:
	unsigned n;
}

静态成员函数与非静态成员函数差别是:非static成员函数既可以访问static数据成员,也可以访问非static数据成员;而static成员函数只能访问static成员。

类的static成员的访问

有两种不同方式来访问类的static成员,既可以通过C的对象来访问,也可以直接通过类C来访问。

#include<iostream>
using namespace std;
class C
{
public:
    static void getN()
    {
        cout<<n<<endl;
    }
private:
    static unsigned n;
};
unsigned C::n=10;
int main()
{
    C::getN(); //直接通过类C来访问
    C c1; 
    c1.getN(); //通过C的对象来访问
    return 0;
}

在类成员函数内定义static变量

#include<iostream>
using namespace std;
class C
{
public:
    void m();
private:
    static unsigned n;
};
unsigned C::n=100;
void C::m()
{
    static int s=0;
    cout<<"s="<<++s<<endl;
    cout<<"n="<<n++<<endl;
    cout<<endl;
}
int main()
{
    C c1,c2; 
    c1.m(); 
    c2.m();
    c1.m();
    return 0;
}

输出结果:

s=1
n=100

s=2
n=101

s=3
n=102

本例在成员函数m中定义了一个static变量s,由于s定义在程序块内,他拥有程序块范围,因为只能在m内部访问。每调用m一次,s就会相应的增加一次,又因为m是C的成员函数,所以C的所有对象都共享这个静态局部变量,这样,对m的每一次调用访问的都是同一个s,同样,对于静态局部变量n来说,它也是一个静态局部变量,所以C的所有对象也都共享这个局部变量。

猜你喜欢

转载自blog.csdn.net/qq_41822647/article/details/85016585