const和static在c和c++中的不同之处

来源:互联网 发布:众划算在淘宝算违规吗 编辑:程序博客网 时间:2024/05/17 09:04

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<int*>pConst(c++解const属性cast)
    函数参数或者返回值能使用 const & or const * 时,尽量使用const属性,增强程序健全性。
    c++中临时对象/内置变量默认具有const属性
  2、类中的const
    类中的const与c语言中的const一样,只是运行时常量,不能作为数组维数使用,即不能取代#define。在类中使用下面两种方式取代#define: 1:static const... 2: enum{....}//enum 不占存储空间
    类中的const 变量占用存储空间
    类中的const成员变量需要在构造函数初始化列表中初始化
    const 对象:在该对象生命周期内,必须保证没有任何成员变量被改变。const对象只能调用const成员函数。
    const成员函数: void fun() const ... 不仅能被const对象调用,也能被非const对象调用,因此,如果确认一个任何成员函数不改变任何成员变量,应该习惯性将该函数定义成const类型。 如果const成员函数需要改变成员变量,有两种实现方式: 1 ,const_cast<class*> this强制取消this指针的const属性。

2:将被改变的成员变量定义成mutable:mutable int i; //应永远只使用第二种方法,让任何阅读程序的人都知道该变量可能被const函数改变。如果一个对象被定义成const,那么该const对象“可能”会被放入到ROM当中,这在嵌入式开发当中有时非常重要。。。。(不能有任何自定义的constructor 和destructor。它的基类或者成员对象不能有自定义的constructor和destructor,不能有任何mutable成员变量)


static主要有三个作用:

(1)局部静态变量

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

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

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

1、局部变量

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

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

2、外部静态变量/函数

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

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

  c++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数. 这是与普通成员函数的最大区别,也是其应用所在, 比如在对某一个类的对象进行计数时, 计数生成多少个类的实例,就可以用到静态数据成员. 在这里面, static既不是限定作用域的, 也不是扩展生存期的作用,而是指示变量/函数在此类中的唯一性. 这也是”属于一个类而不是属于此类的任何特定对象的变量和函数”的含义. 因为它是对整个类来说是唯一的,因此不可能属于某一个实例对象的. (针对静态数据成员而言,成员函数不管是否是static,在内存中只有一个副本, 普通成员函数调用时, 需要传入this指针, static成员函数调用时, 没有this指针. )

                           

原创粉丝点击