const与static的区别

目录

  • 1. 修饰局部变量
  • 2. 修饰全局变量
  • 3. 修饰类成员变量
  • 4. 修饰类成员函数
  • 5. 修饰类对象

对于C/C++来说,
const就是只读的意思,只在声明中使用,意即其所修饰的对象为常量((immutable)),它不能被修改,并存放在常量区。
static一般有两个作用,规定作用域和存储方式(静态存储)。对于局部变量,static规定其为静态存储方式每次调用的初始值为上一次调用后的值,调用结束后存储空间不释放;对于全局变量,如果以文件划分作用域的话,此变量只在当前文件可见,对于static函数也是如此。static修饰的变量如果没有初始化,则默认为0.

1. 修饰局部变量

const int a = 10;

const修饰的全局变量为只读,其值不可修改。如果在程序中企图对const修饰的变量进行修改,那么程序就会报错。

static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。

2. 修饰全局变量

应尽可能少的使用全局变量,可以适当的多用const。如果修饰的全局变量只在一个文件中使用,那么const的作用和前面所说的函数局部变量没有什么区别。

一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。

const和static修饰的全局变量如果要在多个文件之间共享,则可以在其他文件需要时使用extern关键字,声明外部变量,使用时一定包含所定义变量所在的文件:

//file.h
const int a = 10;
static int b = 100;
//file2
#include “file.h”

extern const int a;
extern int b;//不需加static关键字

无论对于const修饰的变量a还是static变量b,这样做的结果是,整个工程的程序链接完成后,所有需要使用该变量的程序共享同一个这个变量的存储区域。

3. 修饰类成员变量

const修饰类成员变量与修饰局部或全局变量类似,其在使用时不能被修改,因此必须在对象实例化时初始化,(利用构造函数初始化列表)。

声明为static的类成员称为类的静态成员用static修饰的成员变量,称之为静态成员变量;静态成员变量必须在类外定义,定义时不添加static关键字,但需要添加作用域限定符声明.

面试题:实现一个类,计算中程序中创建出了多少个类对象。(利用static修饰类成员变量计数)

class A
{
public:
	A()
	{
		++_scount;
	}
	A(const A& t)
	{
		++_scount;
	}
	static int GetACount()
	{
		return _scount;
	}
private:
	static int _scount;
};

int A::_scount = 0;

void TestA()
{
	cout<<A::GetACount()<<endl;
	A a1, a2;
	A a3(a1);
	cout<<A::GetACount()<<endl;
}

本质上来说,static修饰的类变量并不存储在具体的对象当中,因此在计算大小时不计入;其存储在静态存储区中,不因某一对象生命周期的结束而结束,且可以被任意对象随意更改其值,因此使用时应考虑周到避免出现错用。

4. 修饰类成员函数

将const修饰的类成员函数称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。但也可在某些变量前加上mutable关键字,其在对对象进行操作的过程中可以被修改。

用static修饰的成员函数,称之为静态成员函数。特性如下:

  1. 静态成员为所有类对象所共享,不属于某个具体的实例;
  2. 静态成员变量必须在类外定义,定义时不添加static关键字;
  3. 类静态成员即可用(类名::静态成员)或者(对象.静态成员)来访问。
  4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
  5. 静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值

由以上特性,我们可以知道:
静态成员函数内部不能调用非静态成员函数(没有隐含的this指针);但非静态成员函数可以调用类的静态成员函数。

5. 修饰类对象

const修饰类对象,对象中的变量均不可被修改,其只能调用const成员函数。非const对象既可以调用普通成员函数也可以调用const成员函数。由于有时需要创建const对象,因此在定义类时往往要将const函数与普通成员函数一并给出。

static不能修饰一个普通类,但是可以修饰内部类;被修饰的内部类可以被当成一个普通类来使用,不需要先实例化出一个外部类。

最后总结个人对const和static的理解。
const的好处,是引入了常量的概念,让我们不要去修改某一块不该修改的内存,使某一值被保护起来避免出现错误,在编码过程中考虑const是良好的习惯,无论是常量的定义还是类中的const函数。
static我认为最大的用处在于共享。static设置了函数或变量的存储方式:存储在静态存储区域。它使得局部变量和类成员变量的生命周期变长了(因为其存储方式的特殊性)。它使类成员函数更像是一份各个对象共享的代码,使类成员变量也能在各个对象之间共享,它虽然不属于类中的成员,却能被同一类的各个对象为之所用。

你可能感兴趣的:(C++,区别与联系,c++,类,c语言)