C与C++中const差别
一、C中的const。功能比較单一,较easy理解。
· 作用 : 被修饰的内容不可更改。 · 使用场合: 修饰变量。函数參数,返回值等。(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默认是启用编译器扩展的,把project的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中不是常量表达式。因此不能用于定义数组。