关键字static和const的作用以及它们的区别

来源:互联网 发布:数据分析之淘宝大卖家 编辑:程序博客网 时间:2024/06/15 22:28

CPU型号:Intel(R) Core(TM) i5-2450M 

系统:windows 10

IDE:Microsoft Visual C++ 6.0(下文中简称VC)

制图软件:Photoshop cs5


预备知识:

1.程序占用的内存分成五大部分:栈区,堆区,静态区(全局区),文字常量区,程序代码区

2.模块:一个.h加上对应的.c或者.cpp文件,可以理解成一个模块


static:

static的意思是静态。
1.用static修饰的变量存储在静态区(也叫全局区),且在内存中只初始化一次,默认值为0
2.声明在函数内的static变量,只能由在该函数的作用范围内使用
3.声明在模块内(.c文件中,函数体外)的static变量,可以在整个模块内使用,但不能在模块外使用
4.static修饰的函数,只能在定义它的模块内使用,不能在其他模块使用
5.static修饰的类的数据成员被称为类的成员,为其所有对象所共享,也就是说静态数据成员只声明一次
6.静态成员变量必须要在类外初始化!因为它不属于特定的类对象,在没有产生类实例的时候也能用它。定义时要使用作用域标识符来定义,此时不能带static修饰符
7.静态成员变量不能使用this

-测试静态成员的默认值
#include <iostream>using namespace std;static int i;static float f;static char c;static short s;static double d;void main(void){cout<<"i = "<<i<<endl;cout<<"f = "<<f<<endl;cout<<"c = "<<c<<endl;cout<<"s = "<<s<<endl;cout<<"d = "<<d<<endl;}
打印结果:


其中char型的c为0,系统将他解释为\0,即字符串的结束标识符,因此为空。

--测试函数内的static变量
#include <iostream>using namespace std;void fun(void){static int i = 4;i++;cout<<"i = "<<i<<endl;}void main(void){fun();fun();fun();}
打印结果:

由此可见,函数内的static变量只初始化一次,后面执行static变量的初始化被视为无效操作。

--尝试下在函数体外进行打印:
#include <iostream>using namespace std;void fun(void){static int i = 4;i++;cout<<"i = "<<i<<endl;}void main(void){fun();fun();fun();cout<<i<<endl;}
编译时提示:
error C2065: 'i' : undeclared identifier

由此说明static起了隐藏的作用



--测试静态成员变量的类外初始化,不用实例化也能使用:
myclass.h
#ifndef _MYCLASS_H#define _MYCLASS_Hclass A{public:static int a;};#endif
myclass.cpp
#include "myclass.h"int A::a=10;
main.cpp
#include <iostream>#include "mytools.h"#include "myclass.h"using namespace std;void main(void){cout<<A.a<<endl;}


CONST:

const的意思是只读。
1.const修饰的变量,具有不可改变性,此时可称其为常量。由于其不可改变性,修饰符const可保护数据,防止被意外更改,维护程序的健壮性。
2.const修饰形参时,表明它只是一个输入参数,在函数内部并不能更改只能读取
3.修饰类成员函数时,表示他是一个常函数,不能修改类的成员变量
4.代替预定义(#define),因为const可以进行类型检查,消除不必要的隐患
5.为类成员函数提供重载


--测试为类成员函数提供重载:
class A{void fun();void fun() const;};

STATIC和CONST的区别:

1.static修饰的变量可以被修改,而const修饰的变量不能被修改
2.static会限制变量的作用域,而const没有限制
3.static的存储域为静态区,const存储在常量区
4.static修饰的变量可以不用初始化(默认为0),const修饰的变量必须初始化



0 0
原创粉丝点击