您的位置:首页 > 其它

static 静态成员变量 静态成员函数 类中使用

2011-02-18 12:59 549 查看
关于在类中使用static的一些情况:

静态成员函数和静态成员变量的调用格式,尽量采用类名::成员的格式,不要以对象来调用

1. static func静态成员函数

1) 其地址可以直接由函数指针来存储,普通函数其地址只能是由类中的函数指针来存储,如:
class base{
static int func1();
int func2();
};

int (*pf1)()=&base::func1;//普通的函数指针
int (base::*pf2)()=&base::func2;//成员函数指针

这也就是说,如果在类外面去存储类中的函数指针,以便在某个时机去调用的话,只能将该函数声明为static的(注意:尝试去取对象的普通成员函数地址是非法的)。

常见的场景是:
a. 类中的某个函数要被注册成类外的回调函数,由于要存储类中的函数指针,只能将该函数声明称静态的。
b. 创建线程(类内或外),要传递函数指针,也需要声明称static的,原理都是一样的。
总结:如果在逻辑处理到类外时需要存储类中某函数的地址,则需要将该函数声明称static的。
常见的就是:在类内或类外调用某个函数,要求传递函数指针,那么要传递类中的函数,只能声明称static的,这样才可以让参数的局部变量来存储它,如回调函数。

2) 静态成员函数由于是类级别的,不含this指针,故不能直接访问类中的普通成员变量,但可以在函数中加上对象的引用,来控制访问哪个对象的普通成员变量,当然,是可以访问static 成员变量的。

这个也可以从取地址的角度来分析:
当静态成员函数尝试直接访问普通成员变量时,它首先要确认普通成员变量的内存地址,但由于没有this指针,该普通成员变量是无效的,不属于对象的,故无法找到它的地址,故无法访问。

3) 静态成员函数不能加任何修饰符,如const,virtual, volatile等。

2. static member静态成员变量

1) 实质是全局对象的概念,只是放在类中,多了访问控制用域的概念,对类的所有对象共享,类外,也可以想办法访问。故其定义(初始化)不要放在头文件中,否则会报连接错误,重复定义。
2) 可以作为成员函数的缺省参数,普通成员函数不行,如
class base{
public :
static int _staticVar;
int _var;
void foo1(int i=_staticVar);//正确,_staticVar为静态数据成员
void foo2(int i=_var);//错误,_var为普通数据成员
};

3)静态成员变量的类型可以是所属类的类型,普通的成员变量不行,只能是指针或引用,如

class base{
public :
static base _object1;//正确,静态数据成员
base _object2;//错误
base *pObject;//正确,指针
base &mObject;//正确,引用
};
4)静态成员变量不受const成员函数限制,可以被修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: