首页 > 代码库 > 一次性解决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关键字