类中的静态成员函数:
1.函数的行为对所有派生类都一致时,可以声明为静态。
2.因为静态成员函数只跟类有关跟类的实例无关,因此它不需要this指针
3.静态成员函数由于是不与任何对象相关联的,所以是没有this指针的。从这里也可以知道静态成员函数无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其他的静态成员函数。即静态成员函数不能访问非静态成员(非静态成员函数或者非静态成员变量),但是非静态成员可以直接访问静态成员。
例子:
#include
using namespace std;
class MyClass
{
public:
MyClass(int a, int b, int c);
static void func();
void printf()
{
cout << sum << endl;
}
private:
int a, b, c;
static int sum;//静态成员变量的声明
};
int MyClass::sum = 0;//静态成员变量必须在类外定义和初始化
MyClass::MyClass(int a, int b, int c)
{
this->a = a;
this->b = b;
this->c = c;
sum += a + b + c;
}
void MyClass::func()
{
cout << sum << endl;
}
int main()
{
MyClass A(1, 2, 3);
A.func();
A.printf();
MyClass B(4, 5, 6);
B.func();
B.printf();
//MyClass::printf();//错误,非静态成员函数必须与特定对象相对
MyClass::func();//静态成员函数是类中的所有对象共享的,并不但属于特定对象
return 0;
}
运行结果:
类中的静态成员变量:
1.静态成员变量是整个类的实例共享的
2.静态成员变量存储在静态存储区/全局存储局,而非静态成员变量需要实例化才会分配内存。
3.静态成员变量只能在类内声明在类外定义和初始化。
为什么静态成员变量不能在类内定义?
答:为了防止重复定义,静态成员变量是类的所有实例共享的,只需要定义一次就可以,如果在类内定义则每实例化一次类都会重新定义一次静态成员变量,这会产生重复定义。
静态成员不能访问非静态成员,非静态成员可以直接访问类中的静态成员。