C++ 类静态成员变量
在C++中,类的静态成员变量是属于整个类的而非某个特定对象。静态成员变量只存储一份供所有对象共用,即在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。
静态成员变量的定义或者声明需要加关键字static。静态成员可以通过双冒号来引用,即<类名>::<静态成员名> 。使用静态成员变量需要注意以下几点:
- 类的静态成员变量必须先初始化再使用。
- 可以通过类名调用类的静态成员函数,但是不能通过类名调用类的非静态成员函数。
- 静态成员函数中不能引用非静态成员变量。因为静态成员函数属于整个类,在类实例化之前就已经分配内存空间了,而类的非静态成员变量必须在类实例化对象后才有内存空间。所以这个调用就出错了,就好比还没有声明一个变量而提前使用它一样。
- 非静态成员函数可以调用静态成员函数,而静态成员函数不能调用非静态成员函数。
举个栗子,静态成员函数调用非静态成员变量的三种方法:
1、通过类对象引用实现调用
class StaticTest
{
public:
StaticTest(int a, int b, int c);
void GetNumber();
void GetSum();
static void f1(StaticTest &s);
private:
int A, B, C;
static int Sum;
};
#include "StaticTest.h"
#include <iostream>
using namespace std;
int StaticTest::Sum = 0;//静态成员在此初始化
StaticTest::StaticTest(int a, int b, int c)
{
A = a;
B = b;
C = c;
Sum += A + B + C;
}
void StaticTest::GetNumber()
{
cout << "Number = " << endl;
}
void StaticTest::GetSum()
{
cout << "Sum = " << Sum <<endl;
}
void StaticTest::f1(StaticTest &s)
{
cout << s.A << endl;//静态方法不能直接调用一般成员,可以通过对象引用实现调用
cout << Sum <<endl;
}
类StaticTest中有静态成员函数f1,静态成员变量Sum;
#include "StaticTest.h"
#include <stdlib.h>
int main(void)
{
StaticTest M(3, 7, 10), N(14, 9, 11);
M.GetNumber();
N.GetSum();
M.GetNumber();
N.GetSum();
StaticTest::f1(M);
system("pause");
return 0;
}
2、使用全局变量地址
A g_a;
class A
{
public:
static void test()
{
g_a.m_a += 1;
}
void hello()
{
}
private:
static int m_staticA;
int m_a
};
3、使用类自身静态变量
即类中定义一个该类自身的静态成员变量m_staticSelf,最后在静态成员函数中使用m_statticSelf去调用一般成员。
//.h
class CTestA
{
private:
static CTestA* m_staticSelf;
int m_nMark;
public:
CTestA();
~CTestA();
private:
static void WINAPI ThreadProc();
void Process( );
};
//.cpp
CTestA* CTestA::m_staticSelf = NULL;
CTestA::CTestA()
{
m_staticSelf = this;
}
CTestA::~CTestA()
{
}
void WINAPI CTestA::ThreadProc()
{
m_staticSelf->Process();
return 0;
}
void CTestA::Process( )
{
m_nMark = 1;
}
参考文章:
https://www.cnblogs.com/heyonggang/p/3296378.html
https://www.cnblogs.com/rickyk/p/4238380.html