1.static修饰普通变量
static修饰全局变量:
1.作用域:改变链接属性,只在本文件有效,即使extern外部声明也不行,其他文件可定义相同名字的变量
2.初始化:只能被初始化一次,如果是整型不初始化就会自动赋值为0,字符型初始化为空
3.存储区:静态存储区没变
static修饰局部变量:
1.作用域:改变链接属性,生命周期在整个文件有效,但是出了其作用域便不可再用,因此作用域不变,生命周期变
2.初始化:只能被初始化一次,如果是整型不初始化就会自动赋值为0,如果字符型就初始化为空(对于普通变量不初始化会编不过)
3.存储区:由栈变为静态存储区。
2.static修饰普通函数
1.改变连接属性,只在本文件内有效,其他文件可定义相同名字的函数,不会冲突
3.static修饰类成员变量
1.在类外进行定义初始化,前面不加static,也不加访问权限控制符。
class A
{
public:
int _a=1;
static int _b;
};
int A::_b = 0;
int main()
{
A a;
cout << a._a << endl;
cout << a._b << endl;
cout << A::_b << endl;
system("pause");
return 0;
}
2.静态数据成员是该类的所有对象所共有的,对于该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用,因此对于所有的对象来说静态成员变量的值都是相同的。
3.静态成员变量是在程序开始运行时被分配空间,到程序结束才释放,只要类中定义了静态成员变量,即使不定义对象也会为其分配空间。
4.静态成员变量可以通过对象访问,也可以通过指定类域来访问。
静态成员变量初始化的格式:<数据类型><类名>::<静态数据成员变量名>=<值>
静态数据成员的访问格式:<类对象名>.<静态数据成员名> 或者<类类型名>::静态成员变量名
4.static修饰类成员函数
1.普通的成员函数一般都隐含了一个this指针,而static修饰的类成员函数没有this指针(因为属于整个类,而不属于那个对象)
2.静态成员之间可以相互的访问,静态成员函数访问静态成员变量,访问静态成员函数
静态成员函数不能访问非静态的成员函数,和非静态的成员变量(应为没有this指针)
非静态的成员函数可以访问静态成员变量,和静态成员函数
3.静态成员函数可在类内类外定义均可,在类外定义不需要加static关键字
class A
{
public:
static void Fun();
public:
int _a=1;
static int _b;
};
int A::_b = 0;
void A::Fun()
{
cout << _b<< endl;
}
int main()
{
A a;
cout << a._a << endl;
cout << a._b << endl;
cout << A::_b << endl;
a.Fun();
A::Fun();
system("pause");
return 0;
}
static作用的全局变量与普通全局变量的区别?
1.存储位置:全局变量前面加上static就变成了静态的全局变量,全局变量本身就在静态区存储,静态全局变量也在静态存储区存储,因此这点没有差别,也就是声明周期不变。
2.初始化:全局静态变量只被初始化一次,防止在其他文件单元被引用。全局变量和静态全局变量不初始化都会默认为0;
3.作用域:全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,全局变量可以声明为外部变量,被其他源文件使用,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,只在定义该静态变量的源文件中有效,不能被声明为外部的,一个源程序的其他源文件中不能使用。避免了冲突。
static局部变量和普通局部变量的区别?
1.存储位置:静态局部变量-----静态区,普通局部变量-----栈 ,生命周期会发生变化
2.初始化:局部变量可被初始化多次,静态的只会被初始话一次,静态的局部变量不初始化为0,普通的编译不通过。
3.作用域:不变,都是在本函数中
static修饰的函数和普通函数的区别?
作用域不同:普通的函数,可在其他文件中被使用,应当包含头文件。static修饰的函数,只在当前文件有效。