1.静态成员变量:加上static关键字的成员变量
class sheep {
public:
static int number;
};
定义一个sheep的类,里面是sheep的数量,这里我设置成静态成员变量。静态成员变量需要注意的点如下:
- 类似于全局变量,他的存储位置是静态存储区。
- 不管我定义多少个这个类的对象,该成员变量独有一份。
- 必须初始化;初始化要在类外且不加static关键字。
#include <iostream> using namespace std; class sheep { public: static int number; }; int sheep::number = 0;//必须初始化;初始化要在类外且不加static关键字 int main() { sheep a1,a2,a3; a1.number = 1; a2.number = 2; a3.number = 3; cout << a1.number<< endl; cout << a2.number << endl; cout << a3.number << endl; return 0; }
结果:
可以看出,无论我定义了多少个对象,每个对象又改了number,所有对象的number值都和最后一次修改一致。
- 可以使用 类名::静态成员变量 调用
#include <iostream> #include<Windows.h> using namespace std; class sheep { public: static int number; }; int sheep::number = 0;//必须初始化;初始化要在类外且不加static关键字 int main() { system("color A1");//改个控制台背景前景颜色,可以忽略 cout << sheep::number<< endl; return 0; }
2.静态成员函数:加上static关键字的成员函数
- 与静态成员变量相似,静态成员函数可以使用 类名:静态成员函数名调用
- 只与类有关和对象无关,也就没有this指针
- 因为可以直接类名:静态成员函数名调用,也就可以不创建对象,因此静态成员函数里面不能调用非静态成员变量/函数
- 也不能定义为虚函数,因为虚函数是父类指针指向子类对象,和对象有关,不行。
- 没有构造函数和析构函数,因为这两个都是和对象有关
#include <iostream> #include<Windows.h> using namespace std; class sheep { public: static int number; static void mie() { cout << number;//可以调用静态成员变量 } static void eat() { mie();//可以调用静态成员函数 } }; int sheep::number = 0;//必须初始化;初始化要在类外且不加static关键字 int main() { system("color A1");//改个控制台背景前景颜色,可以忽略 cout << sheep::number<< endl; return 0;}
3.应用
假如我需要数一下sheep的个数,定义一个sheep,自动number+1,
为了不让让别人对我的number随意修改,设置成员变量名为:private:static int number;让number做个独一无二的计数器吧
设置构造函数,定义一个sheep number++;设置析构函数,sheep死了,销毁掉,number--;
#include <iostream>
#include<Windows.h>
using namespace std;
class sheep {
private:
static int m_number;
public:
sheep() {
m_number++;
}
~sheep() {
m_number--;
}
static int result() {
return m_number;
}
};
int sheep::m_number = 0;//必须初始化;初始化要在类外且不加static关键字
sheep g_sheep;
int main() {
system("color A1");//改个控制台背景前景颜色,可以忽略
sheep aa;
sheep *p=new sheep();
cout << sheep::result()<< endl;
return 0;
}
结果:输出3
4.单例模式,一种static的特殊用法,保证某个类只创建一个对象
#include <iostream>
#include<Windows.h>
using namespace std;
class sheep {
private:
sheep() {};
static sheep* p;
public:
static sheep* share(){
if (p == NULL) {
p = new sheep();
}
return p;
}
void run() {
cout << "run";
}
};
sheep* sheep::p=NULL;
int main() {
system("color A1");//改个控制台背景前景颜色,可以忽略
sheep* s;
s = sheep::share();
sheep* s1;
s1 = sheep::share();
cout << s<< endl;
cout << s1;
return 0;
}