正文:
1、看下面这个是一个常规的类
#include <iostream>
#include <windows.h>
using namespace std;
class BOX{
int callsNum=1;
public:
BOX(){
callsNum++;
};
int fun(){
return callsNum;
};
};
// int BOX::callsNum=1;
// 程序的主函数
int main()
{
SetConsoleOutputCP(65001);
BOX a;
BOX b;
cout<<a.fun()<<endl;
cout<<b.fun()<<endl;
}
每次a.fun和b.fun的输出结果都是一样的。
但是我现在要知道这个类被申明了多少次,也就是callsNum在每次BOX a,BOX b时都要进行加一操作,累积结果。这时候就要用到static
直接static 会报错的,这也就意味着 static定义的变量要在class外以 类名::变量名 的形式来赋值写法如下
#include <iostream>
#include <windows.h>
using namespace std;
class BOX{
string a="-----\n";
static int callsNum;
public:
BOX(){
callsNum++;
};
int fun(){
cout <<a;
return callsNum;
};
};
int BOX::callsNum=1;
// 程序的主函数
int main()
{
SetConsoleOutputCP(65001);
BOX a;
cout<<a.fun()<<endl;
BOX b;
cout<<b.fun()<<endl;
cout<<a.fun()<<endl;
}
我们理下3次值的输出
1、第一次值是2,是因为BOX a的时候构造函数执行了callsNum++
2、第二次值是3,是因为BOX b的时候构造函数执行了callsNum++
3、第二次值是3,是因为a和b共享了类的静态变量callsNum,所以a.fun的时候输出callsNum的值也变成了3,
好,这个是类静态变量,为什么用静态函数,和类普通函数有什么区别往下看
静态函数
1、静态成员函数只能访问静态成员函数
2、静态成员函数没有this
#include <iostream>
#include <windows.h>
using namespace std;
class BOX{
public:
static int callsNum;
BOX(){
callsNum++;
};
static int fun(){
return callsNum;
};
};
int BOX::callsNum=1;
// 程序的主函数
int main()
{
SetConsoleOutputCP(65001);
// BOX a;//调用静态函数不需要
// cout<<a.fun()<<endl;
cout<< BOX::fun()<<endl;
}
类静态函数的优点就是你不需要生成类对象,也就是不需要 BOX a;这一步。有些场景只需要这个类的某个函数。当然,如果直接就BOX a的话也就说他不进入构造函数!!!!!!,也就没有callsNum++;的动作,一般工具类用的比较多,也就是通用的类。
类静态函数成员内没有this->所以你不能直接this->不然就会报下面错误
正确的代码如下
#include <iostream>
#include <windows.h>
using namespace std;
class BOX{
public:
int bb=1;
static int callsNum;
BOX(){
callsNum++;
};
void funxx(){
cout<< "静态函数调用了类非静态函数funxx()"<<endl;
};
static int fun(BOX a){
a.funxx();
cout<< "静态函数调用了类非静态变量bb="<<a.bb<<endl;
return callsNum;
};
};
int BOX::callsNum=1;
// 程序的主函数
int main()
{
SetConsoleOutputCP(65001);
BOX a;
cout << a.fun(a)<< endl;
}