一、C中的const,功能比较单一,较容易理解。 · 作用 : 被修饰的内容不可更改。 · 使用场合: 修饰变量,函数参数,返回值等。(c++中应用场合要丰富的多) · 特点 : 是运行时const,因此不能取代#define用于成为数组长度等需要编译时常量的情况。同时因为是运行时const,可以只定义而不初始化,而在运行时初始化。如 const int iConst;。 另外,在c中,const变量默认是外部链接,因此在不同的编译单元中如果有同名const变量,会引发命名冲突,编译时报错。 严格地说,C语言中用#define定义的对象称之为常数;用const限定词定义并初始化的对象称之为常量(相对于变量而言)。常数的值在编译时确定,常量的值则在运行时初始化确定(不过此后只能做右值使用)。 二、c++中的const:跟c中比较,内容要丰富很多,当然,作用也更大了。其可主要作为以下两种来使用: 1:非类成员const * 在c++中,const变量(在这里涉及的const都不是类中的const,类中的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成员变量) 三、用法总结 1、C中const的用法总结起来主要分为以下两种: 1, 在定义变量时使用(由于const常量在定义后不能被修改,所以在定义时一定要进行初始化操作): a) 最简单的用法,说明变量为一个常变量(在以下例子里,int 和const的先后顺序可以改变的,这无所谓): const int a=100; int const b=100; b) 说明指针为指向常数的指针,即指针本身的值是可以改变的: const int *a=&b; c) 说明指针本身的值不可改变,但指向的内容可改变: int * const a = &b; d) 说明指针为指向常数的常指针,即指针本身与指针指向的内容都不可改变: const int * const a = &b; e) 说明引用为常数引用,即不能改变引用的值: const int &a=100。 2, 在定义函数时使用: a) 作为参数使用,说明函数体内是不能修改该参数的: void func(const int a); b) 作为返回值使用,说明函数的返回值是不能被修改的: const int func(); c) 在函数中使用const,情况与定义变量的情况基本一致: 2、C++中区别于C的const用法主要分为以下两种 1) const类成员 const类成员在对象构造期间允许被初始化并且在以后不允许被改变。const类成员和一般的const 变量有所不同。const类成员是对应于每个对象而言,它在对象构造期间被初始化,在这个对象的生存周期中不允许被改变。 2) const 成员函数 const 成员函数不允许在此函数体内对此函数对应的类的所有成员变量进行修改,这样可以提高程序的健壮性。Const一般放在函数体后: functionType fun() const。 3)const在C和C++中最大的不同是,在C中,const默认具有外部链接,而C++中则是内部链接。所以当你只在定义const常量的文件中使用该常量时,c++不给你的const常量分配空间,此时const int c = 0;相当于#define c 0;而在C中,它会给每个const 常量分配内存空间。 4)看下面一个程序: #include <stdio.h> int main() { const int a = 5; int b[a]; return 0; } 在vc6.0中命名为.c文件,编译时,编译器提示错误,int b[a]这行:expected constant expression 命名为.cpp文件,则没问题。 这个问题跟编译器无关,code::blocks之所以编译能通过,其实是因为gcc默认是启用编译器扩展的,把工程的build option中的"In C mode ,supper all ISO C90 programs.........."和"treat as errors the warnings demonded by strict ISO ......"两项选上,去掉所有的gcc扩展,实行严格的C90标准,就不能通过编译了。 这个问题其实跟const是所谓“只读”还是“常量”也无关,const在c/c++语法中的确切意义,依然是一个不能通过被它修饰的标识符直接改变的变量。 问题的真正原因是:在c中,常量表达式必须是编译期常量,a不是编译期常量(是运行期常量),无论c90还是c99都如此,但c++没有了这个规定,对此不作限制。正因为const int i在c中不是常量表达式,因此不能用于定义数组。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-12-06 14:50:57