1.静态局部变量:
在静态存储区分配存储单元,在程序整个运行期间都不释放;虽然静态局部变量在整个程序运行期间都不会释放,但是只能在它的定义域的范围内调用该静态成员;
2.静态成员变量:
静态成员变量的内存在类的外部初始化的时候分配,在没有类外初始化的静态成员变量不能使用,该变量为类所有,不为某个单独的对象所有,所以不能通过this指针访问;在StaticUse.h文件声明之后,还要在调用文件(StaticUse.cpp文件或者其他包含了StaticUse.h头文件的.cpp文件);如在.cpp文件中重新定义一下int CStaticUse::stcNum =10;
静态成员变量定义并初始化完成之后可以使用类来访问,如CStaticUse::stcNum++;也可以通过对象访问,如CStaticUse stcUse;stcUse.stcNum++;
3.静态全局变量:
将文件内的全局变量定义为static之后,是无法通过extern方式,在文件外部使用的,只能在文件内使用。静态全局函数也是一样,只能在定义了该静态全局函数的文件内部使用;
1.静态成员函数:
静态成员函数中没有this指针,所以无法访问普通成员变量,主要是用来处理静态成员变量,也可以处理全局变量;不能访问非静态成员;
2.静态全局函数:
静态全局函数只能在定义了该全局函数的代码中使用。在头文件中声明,哪个文件包含了这个头文件并且实现了该静态全局函数的定义,就可以在该代码文件中使用;
StcTest.h:
#pragma once
static int stcPrintG(); //静态全局函数
int GPrintH();//普通全局函数
class CStcTest
{
public:
CStcTest();
~CStcTest();
static int m_stc_a;
static int m_stc_b;
static int m_stc_c;
static int m_stc_d;
int m_e;
int PrintB(); //普通成员函数
static int stcPrintD();//静态成员函数
//static int stcPrintE();//静态成员函数
static int stcPrintF();//静态成员函数可以访问静态全局函数
};
StcTest.cpp
#include "StcTest.h" #includeusing namespace std; static int g_stc_f = 6; //静态全局变量 static int g_stc_g = 7; //静态全局变量 static int g_stc_h = 8; //静态全局变量 int CStcTest::m_stc_b = 2; int CStcTest::m_stc_d = 4; CStcTest::CStcTest() { } CStcTest::~CStcTest() { } //普通成员变量既可以访问多种变量 int CStcTest::PrintB() { m_e = 5; cout << "this->m_stc_b " << this->m_stc_b << endl; cout << "this->m_e " << this->m_e << endl; cout << "g_stc_f " << g_stc_f << endl; return 0; } //静态成员函数仅可以访问静态成员变量 int CStcTest::stcPrintD() { cout << "m_stc_d " << m_stc_d << endl; return 0; } //m_e是普通成员变量,由于stcPrintE是静态成员函数 //静态成员函数,其中没有this指针,无法访问普通成员变量 //错误示例: //int CStcTest::stcPrintE() //{ // cout << "" << m_e << endl; // return 0; //} int CStcTest::stcPrintF() { cout << "g_stc_f " << g_stc_f << endl; stcPrintG(); return 0; } //静态全局函数定义 int stcPrintG() { cout << "g_stc_g " << g_stc_g << endl; return 0; } //普通全局函数定义 int GPrintH() { cout << "g_stc_h " << g_stc_h << endl; return 0; }
main.cpp:
#include "StcTest.h" #includeusing namespace std; int CStcTest::m_stc_a = 1; int CStcTest::m_stc_c = 3; //int stcPrintG() //{ // cout << "g_stc_g " << CStcTest::m_stc_a << endl; // return 0; //} //将文件内的全局变量定义为static之后,是无法通过extern方式,在文件外部使用的,只能在文件内使用。 //extern int stc_f; int main() { CStcTest st; //通过对象来访问 std::cout << "st.a=" << st.m_stc_a << endl; //通过类来访问 cout << "CStcTest::c=" << CStcTest::m_stc_c << endl; st.PrintB(); st.stcPrintD(); st.stcPrintF(); //无法调用静态全局函数,虽然已经在StcTest.h中声明,并且在StcTest.cpp定义 //找不到定义,除非在该main.cpp文件中重新定义 //stcPrintG(); //可以调用普通全局函数,前提是要在StcTest.h中声明,并且在StcTest.cpp中定义; GPrintH(); getchar(); return 0; }



