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

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 
using namespace std;

static int i;
static float f;
static char c;
static short s;
static double d;
void main(void)
{
	cout<<"i = "<关键字static和const的作用以及它们的区别_第1张图片 
     

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

--测试函数内的static变量
#include 
using namespace std;

void fun(void)
{
	static int i = 4;
	i++;
	cout<<"i = "<
打印结果:

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

--尝试下在函数体外进行打印:
#include 
using namespace std;

void fun(void)
{
	static int i = 4;
	i++;
	cout<<"i = "<
编译时提示:
error C2065: 'i' : undeclared identifier

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



--测试静态成员变量的类外初始化,不用实例化也能使用:
myclass.h
#ifndef _MYCLASS_H
#define _MYCLASS_H

class A
{
public:
	static int a;
};

#endif
myclass.cpp
#include "myclass.h"
int A::a=10;
main.cpp
#include 
#include "mytools.h"
#include "myclass.h"
using namespace std;

void main(void)
{
	cout<


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修饰的变量必须初始化



你可能感兴趣的:(C++)