欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c与c++中const和static的区别介绍

程序员文章站 2022-04-23 17:21:17
static主要有三个作用: (1)局部静态变量 (2)外部静态变量/函数 (3)静态数据成员/成员函数 前两种C和C++都有,第三种仅在C++中有。 1、局部变量 s...

static主要有三个作用:

(1)局部静态变量

(2)外部静态变量/函数

(3)静态数据成员/成员函数

前两种C和C++都有,第三种仅在C++中有。

1、局部变量

static类型局部变量存储在静态存储区,在程序整个运行期间都不释放。

static局部变量在所处模块在初次运行时进行初始化工作,且只操作一次。

2、外部静态变量/函数

用来表示不能被其它文件访问的全局变量和函数。但为了限制全局变量/函数的作用域, 函数或变量前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。注意此时, 对于外部(全局)变量, 不论是否有static限制, 它的存储区域都是在静态存储区,生存期都是全局的. 此时的static只是起作用域限制作用, 限定作用域在本模块(文件)内部.

使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。

3、静态数据成员/成员函数

c++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数.

这是与普通成员函数的最大区别,也是其应用所在, 比如在对某一个类的对象进行计数时, 计数生成多少个类的实例,就可以用到静态数据成员. 在这里面, static既不是限定作用域的, 也不是扩展生存期的作用,而是指示变量/函数在此类中的唯一性. 这也是”属于一个类而不是属于此类的任何特定对象的变量和函数”的含义. 因为它是对整个类来说是唯一的,因此不可能属于某一个实例对象的.

(针对静态数据成员而言,成员函数不管是否是static,在内存中只有一个副本, 普通成员函数调用时, 需要传入this指针, static成员函数调用时, 没有this指针. )

const在C语言中:

作用:被修饰的内容不能被修改。

使用场合:修饰变量,函数参数,返回值等。

特点: 是运行时const,因此不能取代#define用于成为数组长度等需要编译时常量的情况。同时因为是运行时const,可以只定义而不初始化,而在运行时初始化。如

const int iConst;。 另外,在C中,const变量默认是外部链接,因此在不同的编译单元中如果有同名const变量,会引发命名冲突,编译时报错。

const在C++中:

1、非类成员const

在c++中,const变量(非类成员)默认是外部连接,因此在不同的编译单元中可以有同名的const

变量定义。

是编译时常量,因此可以像#define一样使用,而且因为上面一点,可以在头文件中定义const变量,包含的不同的cpp文件(编译单元)中使用而不引起命名冲突。

编译器默认不为const变量分配内存,除非:1.

使用 extern 申明, 2:程序中有引用const 变量的地址。

可以使用下面的类型转换(不安全的):

1: int * = (int *)pConst

2:int*=const_cast