静态成员
由关键字static修饰说明的类成员,成为静态类成员(static class member)。虽然使用static修饰说明,但与函数中的静态变量有明显差异。类的静态成员为其所有对象共享,不管有多少对象,静态成员只有一份存于公用内存中。类的静态成员分为静态成员变量和静态成员函数。
1 静态成员变量
在类定义中,用关键字static修饰的数据成员为静态数据成员。
该类产生的所有对象共享系统为静态成员分配的一个存储空间,而这个存储空间是在编译时分配的,在定义对象时不再为静态成员分配空间,即静态成员的大小不占对象的空间。
静态数据是该类所有对象所共有的,可提供同一类的所有对象之间信息交换的捷径。
1.1 静态成员变量的初始化
静态成员变量的初始化是在类外初始化,初始化的语法为
类型名 类名::变量名 = 值
1.2 静态成员变量的使用
1 类名::静态数据成员名
2 通过类实例化出的对象来进行访问
3 通过成员函数来进行访问(静态函数、非静态函数都可以)
#include <iostream>
#include <istream>
#include <ostream>
#include <string>
using namespace std;
class Maker
{
public:
Maker(int d = 0) :data(d)
{
}
void show()
{
cout << "data:" << data << endl;
cout << "count:" << count << endl;
}
static void print()
{
cout << "count:" << counnt << endl;
}
public:
static int count; // 静态数据成员
private:
int data;
};
int Maker::count = 0; // 静态数据成员类外初始化
int main()
{
Maker m;
m.show(); // 通过普通成员函数访问静态成员变量
m.print(); // 通过静态成员函数访问静态成员变量
cout << Maker::count << endl; // 通过类的作用域访问静态成员变量
cout << m.count << endl; // 通过实例化的对象访问静态成员变量
// sizeof(m) = 4,静态成员变量不占有类的空间
cout << "size:" << sizeof(m) << endl;
system("pause");
return 0;
}
2 静态成员函数
函数成员说明为静态,将与该类的不同对象无关,与静态数据成员相反,为使用方便,静态函数成员多为公有的,静态函数的调用与静态变量的调用类似,在对象之外
可以通过作用域运算符进行调用
类名::函数名(参数)
2.1 静态成员函数的性质
一个常规的成员函数声明描述了三件在逻辑上相互不同的事情
1、该函数能访问类声明的私用部分
2、该函数位于类的作用域之中
3、该函数必须经由一个对象去激活(有一个this指针)
但是通过将函数声明为static,可以让它只有前两种性质,即静态成员函数由同一类的所有对象共享,它不具有指向某一具体对象的this指针,即不能通过静态函数访问普通的成员变量和成员函数,静态函数只能管理类中的静态成员和静态函数
class Maker
{
public:
Maker(int d = 0) :data(d)
{
}
void show()
{
cout << "data:" << data << endl;
cout << "count:" << count << endl;
}
static void print()
{
// show函数为普通的成员函数,在调用时需要传入this指针
// 即在调用时会被改写为 show(Maker *const this)
// print为静态成员函数,没有this指针,调用非法
show(); // error 静态函数内不能调用普通的成员函数
cout << count << endl; // right
// error 原因同普通成员函数的调用,需要this指针,但是静态成员函数不提供
cout << data << endl;
}
public:
static int count;
private:
int data;
};
int Maker::count = 0;