栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 中的静态变量和静态函数

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ 中的静态变量和静态函数

C++ 静态变量和静态函数 1. 静态全局变量,静态成员变量和静态局部变量;

1.静态局部变量:
在静态存储区分配存储单元,在程序整个运行期间都不释放;虽然静态局部变量在整个程序运行期间都不会释放,但是只能在它的定义域的范围内调用该静态成员;

2.静态成员变量:
静态成员变量的内存在类的外部初始化的时候分配,在没有类外初始化的静态成员变量不能使用,该变量为类所有,不为某个单独的对象所有,所以不能通过this指针访问;在StaticUse.h文件声明之后,还要在调用文件(StaticUse.cpp文件或者其他包含了StaticUse.h头文件的.cpp文件);如在.cpp文件中重新定义一下int CStaticUse::stcNum =10;
静态成员变量定义并初始化完成之后可以使用类来访问,如CStaticUse::stcNum++;也可以通过对象访问,如CStaticUse stcUse;stcUse.stcNum++;

3.静态全局变量:
将文件内的全局变量定义为static之后,是无法通过extern方式,在文件外部使用的,只能在文件内使用。静态全局函数也是一样,只能在定义了该静态全局函数的文件内部使用;

2. 静态成员函数和静态全局函数;

1.静态成员函数:
静态成员函数中没有this指针,所以无法访问普通成员变量,主要是用来处理静态成员变量,也可以处理全局变量;不能访问非静态成员;
2.静态全局函数:
静态全局函数只能在定义了该全局函数的代码中使用。在头文件中声明,哪个文件包含了这个头文件并且实现了该静态全局函数的定义,就可以在该代码文件中使用;

3. 代码示例:

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"
#include 

using 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"
#include 
using 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;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/917151.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号