本人是新手。前几天专门学习了一下C++的静态类成员,在此总结一下C++静态类成员的用法。
一、类静态数据成员
1.为啥用类静态成员?
有时候在设计类类型的时候,需要该类的所有对象都访问一个全局对象。比如计算在程序中创建的类对象个数,或者共同拥有的一个值。这个时候,提供一个共同使用的全局对象比每个类对象维持一个独立的成员 更加有效。
类静态成员被当做该类类型的全局对象。即该类中静态数据成员只有一份。[静态数据成员没有进入程序的全局名字空间,而处理该类的类域中]。
2.类静态成员定义以及初始化
在类数据成员的声明前加上关键字 static即被声明为类的静态数据成员。
一般情况下,类静态成员在该类定义之外被初始化。初始化的时候,必须被类名限定修饰。例如 int MyTest::m_static = 1;//MyTest为类名
在程序中,类静态成员在程序中只能提供一个定义。因此类静态成员的初始化不能放在头文件中。一般我们放置实现的c文件中。作为特殊的。有序型的const静态数据成员可以在类体中用一常量值初始化。例如
//MyTest.h
class MyTest{
//...
private:
static const int size = 16;
static const char name[size];
};
//MyTest.c
const int MyTest::size; //定义
const charMyTest::name[size] = "this is test!";
在上述的例子中,int型为有序型,可以直接在类体中初始化,但是还是必须在实现文件中定义。
name是一个数组,不是有序型,因此不能在类体中初始化,必须在实现文件中初始化并定义。
3.类静态数据成员的访问。
类静态成员的访问有以下两种:
A.在类成员函数中,可以直接访问该类的静态成员
B.在非成员函数中,可以通过成员访问操作符或者类名限定修饰的名字直接访问它。
4.类静态数据成员的其他用法
A.类静态成员的类型可以为其所属类。如同非静态数据成员声明为该类对象的指针或者引用。例如
class Mytest{
//...
private:
static Mytest m_static_mem;
Mytest *m_pMem;
};
B.类的静态数据成员可以为类成员函数的缺省实参。
二、静态成员函数
类体中静态成员函数声明 为普通成员函数的前面加关键字static。此外静态数据成员声明不能用const,volatile修饰。
类体外静态数据成员的定义不能在前面加关键字 static
静态成员函数的调用与类的静态数据成员基本一样。
区别于普通的成员函数,静态成员函数没有this指针,因此访问了非静态数据成员的成员函数都不能声明为静态成员函数。
一般我们实现静态成员函数都是为了方便与对类的静态数据成员进行操作。
有错误之处,还请指出。谢谢!