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.

http://wenku.baidu.com/view/186fb4ef5ef7ba0d4a733bf9.html

[转]C艹中的各种const总结的更多相关文章

  1. c与c++中的extern const的区别和联系

    最近复习c++,发现了这个东西. c语言里面,我们在一个.c文件中用const定义了一个全局变量后,可以在另一个.c文件中用extern const来引用,但在c++中在链接的时候会报undefine ...

  2. 在 C++ 程序中只使用 const 常量而不使用宏常量

    在 C++ 程序中只使用 const 常量而不使用宏常量,即 const 常量完 全取代宏常量. #include <iostream> /* run this program using ...

  3. javascript中var let const三种变量声明方式

    javascript中var let const三种变量声明方式 1.var  ①var表示声明了一个变量,并且可以同时初始化该变量. ②使用var语句声明的变量的作用域是当前执行位置的上下文:一个函 ...

  4. PHP中define()和const定义常量的区别

    在PHP中可以通过define()和const两种方式定义常量可是在开发中我们应该什么时候用define()定义常量,什么时候用const定义常量? 这两种方式定义常量的主要区别是什么? 从5.3版本 ...

  5. 第24课经典问题(中)-----关于const对象的疑问

    关于const对象的疑问const关键字能否修饰类的对象?如果可以,有什么特性?const关键字能够修饰对象const修饰的对象为只读对象只读对象的成员变量不允许被改变.(对象是只读的,成员变量不允许 ...

  6. 浅谈JS中 var let const 变量声明

    浅谈JS中 var let const 变量声明 用var来声明变量会出现的问题: 1. 允许重复的变量声明:导致数据被覆盖 2. 变量提升:怪异的数据访问.闭包问题 3. 全局变量挂载到全局对象:全 ...

  7. C++ 中 static 与 const 的用法及对比

    在这个学习过程中我对 static 及 const 的使用时常会混淆,因此整理,加深记忆 一.类的静态成员 如果某个属性为整个类所共有,不属于任何一个具体对象,则采用 static 关键字来声明静态成 ...

  8. PHP 中 define() 和 const 定义常量时的区别

    自 PHP 5.3.0 起,有两种方式定义常量,使用 const 关键字或者 define() 函数:   1 2 const FOO = 'BAR'; define('FOO', 'BAR'); 这 ...

  9. C++中如何修改const变量

      一.结论 声明:不同于C语言的const变量修改问题(可以通过指针间接修改const变量的值),这里只讨论C++ 里的const. C++ const 修饰符,表示常量,即如果以后保证不会修改则声 ...

随机推荐

  1. Orchard运用 - 如何隐藏去除某些Meta标记

    众所周知,每个系统多多少少都会有一些痕迹或标记之类的东西, 比如默认的Orchard搭建的网站, 如果你查看源代码即可看到类似的代码: <meta content="Orchard&q ...

  2. datanode无法启动问题

    在执行了hdfs namenode -format命令之后,再启动datanode发现无法启动. 查看datanode的日志发现: datanode的ClusterId和namenode的Cluste ...

  3. C#模拟MSN窗体抖动

    C#模拟MSN窗体抖动 窗体抖动是件很有意思的事情,就让我们看看一起来看看它的原理吧. 其实是生成随机数,然后改变Form的左上角的坐标.我用的是循环来弄得,其实可以用timer来控制. 我把抖动分成 ...

  4. winrar X64 win10 破解

    破解方法, win10 64位 复制下面内容到 RarReg.key 文件 RAR registration datawncnUnlimited Company LicenseUID=1b064ef8 ...

  5. Antlr与Regex

    Antlr与Regex都是文本分析工具. Antlr内部分为词法(Lexer)和语法(Parser),在Antlr中,变量第一个字符大写表示词法,变量第一个字符小写表示语法.词法表示哪些是有效的词,语 ...

  6. VS中的代码拖放

    平时数据操作中,我们经常在选择文件,由于数据太多.数据目录太深,选择数据文件到TextBox中非常不方便,于是就想让控件支持拖放数据,很多软件都支持这个功能,非常实用. 在ArcGIS10.x开发平台 ...

  7. Citrix服务器虚拟化之二十九 XenApp 6.5发布服务器上的应用程序

    Citrix服务器虚拟化之二十九  XenApp 6.5发布服务器上的应用程序 XenApp可发布以下类型的资源向用户提供信息访问,这些资源可在服务器或桌面上虚拟化: 1)  服务器桌面:发布场中服务 ...

  8. java泛型通配符?

    转自:http://www.linuxidc.com/Linux/2013-10/90928.htm T  有类型 ?  未知类型 一.通配符的上界 既然知道List<Cat>并不是Lis ...

  9. iOS开发之UITableView的使用

    这一篇记录的是iOS开发中UITableView的使用,iOS中的UITableView跟Android中的ListView特别相似,以下用一个Demo来说明: 1.Xcode中新建projectTe ...

  10. HDU 5336 XYZ and Drops

    Problem Description XYZ is playing an interesting game called "drops". It is played on a r ...