Ps: 难免碰到C家族的代码 ,各种const直接搞晕,搜集各种资料备用。。。。
------------------------------------------------------------------------------------------------
No.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,情况与定义变量的情况基本一致:
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中不是常量表达式,因此不能用于定义数组。
No.2.