标签:style io ar color os 使用 sp 文件 on
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;
}
标签:style io ar color os 使用 sp 文件 on
原文地址:http://blog.csdn.net/djb100316878/article/details/41280819