首页 > 代码库 > 一次性解决static关键字

一次性解决static关键字

static关键字的用法:

1:static局部变量的特点:

a):地址在全局区

b):只有在第一次进入函数的时候初始化

c):生命期在离开main函数之后结束

d):每次进入函数后不会重新进行初始化,保留进入函数之前的初值。

void func(){	static int n = 6;//static静态局部变量只在第一次调用该函数时初始化一次,后面调用不会再进行初始化。	n = n + 10;	cout<<n<<endl;}int main(int argc, char* argv[]){	int i  =0;	while(i< 4)	{		func();		i++;	}	return 0;}

static局部变量主要是改变了变量的生命期


2):static全局变量的用法:

a):普通全局变量可以跨文件用extern关键字来使用

b):static全局变量不可以yongextern关键字跨文件调用

c):加了static关键字之后,不同的文件可以有相同名字的全局变量

d):static全局变量的含义就是本源文件专用,或者叫本文件私有变量

例如A文件我们定义了一个变量

int g_iNumber;

可以在B文件调用:

extern int g_iNumber;

如果在A文件当中定义的是 

static int g_iNumber;

那么在B文件当中不可以出现:

extern int g_iNumber;

但是可以定义同名的变量:

int g_iNumber;

 

3:static成员变量的用法:

a):当类内的变量前面加上static后,就是静态成员变量;

b):静态成员变量的地址在全局区,是全局性质的变量;

c):静态成员变量只是名义上划分到类里面,但是该类的空间不包括静态成员变量

d):调用方法可以用对象或者this指针,也可以使用类名加定义域去使用

e):静态成员变量一般定义为公有(但是单例模式中为私有的),跟对象无关。它为全体类对象所有。

 

#include <iostream>using namespace std;class Test{public:	static int i;	Test()//:i(0) //ERROR static 成员变量不可以在这里初始化	{		//i = 0; ERROR:不可以在这里初始化		i= 88; //但是如果在类外初始化了,这里可以调用i进行赋值修改操作	}	void func()	{		this->i = 9; //this指针调用static成员变量	}};int Test::i = 0; int main(){	Test t1;	t1.i = 9;//对象调用static成员变量	Test::i = 10;//类名加定义域调用static成员变量	cout<<sizeof(t1)<<endl; //输出为1; 说明static成员变量不属于类空间	return 0;}


4:static成员函数:

a)一个成员函数如果前面加上static关键字就是全局函数的性质;
b)只是名义上划归为某个类内,函数内没有this指针的形式参数;
c)静态成员函数内不可以通过this指针调用本类的成员(函数和变量);

d):普通成员函数可以调用普通成员变量和static成员变量

e):static成员函数不可以调用非静态成员变量,因为没有this指针;

#include <iostream>using namespace std;class Test{private:	int m_iNum;public:	static int i;	Test()//:i(0) //ERROR static 成员变量不可以在这里初始化	{		//i = 0; ERROR:不可以在这里初始化		i= 88; //但是如果在类外初始化了,这里可以调用i进行赋值修改操作	}	void func()	{		this->i = 9; //this指针调用static成员变量	}	static int getNum()//(zhel没有隐藏的参数this指针,而普通的成员函数都有一个隐藏的参数this指针)	{		//int k = m_iNum;//ERROR 因为静态成员函数没有this指针,所以没办法访问非静态成员变量。		i = 8888;//可以访问static成员变量,当然是可以的,因为static变量时全局性质的。		return i;	}};int Test::i = 0; int main(){	/*	Test t1;	t1.i = 9;//对象调用static成员变量	Test::i = 10;//类名加定义域调用static成员变量	cout<<sizeof(t1)<<endl; //输出为1; 说明static成员变量不属于类空间	*/	Test t1;	t1.getNum();//对象调用static成员函数	Test::getNum();//类名加定义域调用static成员变量	return 0;}


 

 

 

 

 

一次性解决static关键字