目录
为什么要有"static"关键字
用类可以定义很多对象,每一个对象都有属性,那请问有没有一个属性,是属于所以对象的?假设有这个属性c,是属于所有对象的,那么这个变量,就是静态成员变量,要用"static"关键字修饰。
基本概念
1)定义静态成员变量
- 关键字 static 可以用于说明一个类的成员,
静态成员提供了一个同类对象的共享机制
- 把一个类的成员说明为 static 时,这个类无论有多少个对象被创建,这些对象共享这个 static 成员
- 静态成员局部于类,它不是对象成员
2)静态成员函数
- 静态成员函数数冠以关键字static
- 静态成员函数提供不依赖于类数据结构的共同操作,它没有this指针
- 在类外调用静态成员函数用 “类名 :: ”作限定词,或通过对象调用
- 注意:静态成员函数中,不能使用普通变量和普通成员函数!
举例说明
先写个类BB:
class BB
{
public:
void printC()
{
cout<<"c:"<<c<<endl;
}
void AddC()
{
c = c + 1;
}
static void getC() //静态成员函数
{
cout<<"c:"<<c<<endl;
//请在静态成员函数中,能调用 普通成员属性 或者 普通成员函数吗?
//cout<<"a:"<<a<<endl; //error C2597: 对非静态成员“BB::a”的非法引用
}
protected:
private:
int a;
int b;
static int c; //静态成员变量
};
在类中,定义了一个静态成员函数getC()和静态成员变量c(属于整个类的),在主函调用中,须先声明:
//静态函数中 不能使用 普通成员变量 普通成员函数 ..
int BB::c = 10;
再调用:
void main()
{
BB b1, b2, b3;
b1.printC(); //10
b2.AddC(); //11
b3.printC(); //11
cout<<"hello..."<<endl;
system("pause");
return ;
}
运行如下:
可以看出,静态变量c在类里面的确属于公用的。
下面来看下静态成员函数如何调用:
void main()
{
//静态成员函数的调用方法
b3.getC(); //用对象.
BB::getC();//类::
cout<<"hello..."<<endl;
system("pause");
return ;
}
严重注意: 静态成员函数中,只能使用静态成员变量(属于整个类的),而不能使用普通变量和普通成员函数!
这是因为静态成员函数是分不清楚普通变量到底是属于那个对象的。
如图请问,代码中的a是属于那个对象的呢?编译器是分辨不出来的,所以,才会报错。而静态成员变量c是属于整个类的,所有对象的,所以,可以用。
总体代码
dm15_static关键字.cpp
#include <iostream>
using namespace std;
class BB
{
public:
void printC()
{
cout<<"c:"<<c<<endl;
}
void AddC()
{
c = c + 1;
}
static void getC() //静态成员函数
{
cout<<"c:"<<c<<endl;
//请在静态成员函数中,能调用 普通成员属性 或者 普通成员函数吗?
cout<<"a:"<<a<<endl; //error C2597: 对非静态成员“BB::a”的非法引用
}
protected:
private:
int a;
int b;
static int c; //静态成员变量
};
//静态函数中 不能使用 普通成员变量 普通成员函数 ..
int BB::c = 10;
void main()
{
BB b1, b2, b3;
b1.printC(); //10
b2.AddC(); //11
b3.printC(); //11
//静态成员函数的调用方法
b3.getC(); //用对象.
BB::getC();//类::
cout<<"hello..."<<endl;
system("pause");
return ;
}