程序员

静态成员

2018-09-16  本文已影响15人  平凡的鱼仔

静态成员分为:

1.静态数据成员
2.静态成员函数

静态成员的特点:

1.不管创建了多少个对象,它都只有一个副本,这个副本由所有属于这个类的对象共享。
2.静态成员解决了不同对象间的数据和函数共享问题,不属于任何一个对象,它的作用域是类范围。
3.静态成员在每个类对象中并不占存储空间,只是在类中分配存储空间,供所有对象使用。每个对象都可以对该类的静态数据成员的值进行更新。
4.静态数据成员具有静态生存期,必须对它进行初始化。在vs2012环境下,发现这点有问题,在类外定义但不初始化可以通过编译。
5.公有的静态数据成员可以直接访问,但私有(private)、保护(protected)的必须通过公有接口进行访问。

静态数据成员初始化的注意事项:

1.类中的声明只是静态数据成员的引用性声明,应在类体外定义并初始化,静态成员初始化与它的控制权限无关
2.初始化时不加static,避免和一般静态变量或对象混淆。
3.由于静态数据成员是类的成员,因此在初始化时必须使用作用域运算符(::)限定它所属的类。
4.公有的静态数据成员可以直接访问,但私有的或保护的静态数据成员要通过公有的接口进行访问,一般将这个公有的接口定义为静态成员函数。

所有的变量其实在使用前都要定义,当然,静态成员变量在其中。

静态成员函数

静态成员函数属于整个类,不属于类中的任意一个对象。
静态成员函数既可以在类体内声明,也可以在类体外声明,在类体外声明时不需要加static前缀。静态成员函数在类中只有一个副本,它可以直接访问类中的静态成员,不能直接访问非静态成员;若要访问,必须通过参数传递的方式来获得相应的对象,再通过对象进行访问。
假如Display()是一个类中的静态成员函数,Point为类名,一般采用Point::Dispaly()的方式调用,而不是用对象.Display()。前者强调了Display()属于某一个类,而不是属于某一个对象。静态成员在类的任何对象建立之前就已经存在了。静态成员在程序内部不依赖于任何对象被访问,即就算没有创建对象,也可以通过类名访问类的公有静态成员。

上述静态成员特点4的详解

静态成员的初始化有些小问题,在类外定义了之后其实成员就被分配了内存,不初始化也不报错。

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

class Student
{
public:
    static int a;
};
int Student::a;  //类外定义,不进行初始化,静态成员不能定义为局部变量
int _tmain(int argc, _TCHAR* argv[])
{
    cout<<Student::a<<endl;  //不报错,这里输出为0,即默认值是0
    getchar();
    return 0;
}
#include "stdafx.h"
#include <iostream>
using namespace std;

struct rectangle
{
    int width;
    int length;
};
class Polygon
{
public:
    static rectangle rec;
};

rectangle Polygon::rec; //这种情形不知道怎么初始化,只能进行类外定义

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

ps:静态、非静态成员函数都可以访问静态数据成员。

上一篇下一篇

猜你喜欢

热点阅读