BBS.ChinaUnix.net
首页 | 新闻 | Linux | FreeBSD | AIX | Windows | 博客 | 论坛 | 存储 | 网络 | 人才 | Wiki | 资料 | 读书 | 手册 | 下载 | 空间 | 搜索
  会员: 密码: 免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 


const总结
首页 » 论坛 » C/C++ »  
[打印] [订阅] [收藏] [本帖文本页] [推荐此主题给朋友,立即获积分]
liaoweijun   帅哥 (jack)
圣骑士




UID:582176
注册:2007-7-2
最后登录: 2008-07-16
帖子:110
精华:0

可用积分:98 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

来自:湖南
状态:...离线...

[个人空间] [短信] [博客]


1楼 发表于 2008-7-14 16:27 
C/C++中const用的很多,但是总让人犯迷糊。总结下它的用法,如果说的不对还请指正。
1、const修饰的后的对象不是一个常量,它只表示修饰的对象是个只读的对象。
可以用下面的方法证明:
const int a = 1;

switch(i)
{
    case a: ... break;
    case 2: ... break;
    default: ... break;
}
如果i等于1,不会执行case a: 后面的语句。

2、const修饰后的对象,默认的表示此对象只能在该文件中用。
如:const int a = 1; 等同于 static const int a = 1;
如想在其他地方用到a,可以这样定义 extern const int a=1;

3.用附件中图的方法去解释一些比较复杂的声明,可以让一些难懂的声明变得很简单。
比方说const int * const  p;
用图中的说明,很容易解释,p是一个只读的,指向只读整型的指针。
或者更复杂点的:char * const * (* next)();
可以解释为:next是一个指向函数的指针,该函数返回另外一个指针,这个返回的指针指向一个只读的指向char的指针。

以上说明还不够全面,希望各位大虾把知道共享下呀。




p.JPG (93.32 KB) 2008-7-14 16:27
 


您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-10-07
帖子:2010
精华:4

可用积分:1784 (家境小康)
信誉积分:100
专家积分:21 (本版:20)
空间积分:0
推广积分:0

来自:成都
状态:...保密...

[个人空间] [短信] [博客]


2楼 发表于 2008-7-14 16:38 
c就不说了
我一直希望哪位老大把c++中const的所有情况解释一次,比如const用在结构体里的时候,用在全局区的时候,用在局部区的时候等等



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________


C调 ---- C语言
都是最喜欢的
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
zszjxh   帅哥 (Felix)
大天使


CU奥运火炬传递手2008
UID:654060
注册:2007-12-14
最后登录: 2008-10-07
帖子:1666
精华:0

可用积分:1444 (家境小康)
信誉积分:0
专家积分:42 (本版:30)
空间积分:0
推广积分:0

来自:山东潍坊
状态:...离线...

[个人空间] [短信] [博客]


3楼 发表于 2008-7-14 16:40 
C和C++中的const是不一样的
const int a = 1;

switch(i)
{
    case a: ... break;
    case 2: ... break;
    default: ... break;
}
如果i等于1,不会执行case a: 后面的语句。

在C++中这句是会执行的,至少在VC中是这样。

[ 本帖最后由 zszjxh 于 2008-7-14 16:45 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
gawk
光明使者
渔夫



UID:394228
注册:2006-3-29
最后登录: 2008-10-07
帖子:837
精华:0

可用积分:1618 (家境小康)
信誉积分:100
专家积分:0 (本版:0)
空间积分:804
推广积分:20

来自:广西
状态:...在线...

[个人空间] [短信] [博客]


4楼 发表于 2008-7-14 17:05 
总结的c专家编程上的,鼓励一下



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

虽千万人吾往矣……
修炼perl中……
聆听man老师和perldoc老师教诲……

积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
shan_ghost
精灵




UID:527235
注册:2007-2-8
最后登录: 2008-09-29
帖子:188
精华:0

可用积分:219 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


5楼 发表于 2008-7-14 17:43 
俺来补充一点

1、旧的#define语法定义的是“宏替换”,不是严格意义上的常量。
    或者说,传统上把#define a 100中的a称为“常量”是不准确的;事实上,前面举例的这个语法有点汇编语言里“立即数”的味道:无需寻址,内嵌于指令。

2、const语法定义了真正的“常量”;编译器必须像普通变量般为它分配存储空间,然后“阻断写操作”。


例:
a.h中:
#define A 100

a.c中:
int AA = 200;


b.h中:
#include “a.h”
extern volatile const int AA;


则:
任何一个包含a.h的实现中,A实际都不存在;反汇编码中,表达式中对A的引用会被立即数100替代。

a.c中,AA是个普通整型全局变量;而在包含b.h的实现文件中,AA是一个常量(但它的值总在偷偷的改变)。

如果去掉volatile声明,AA就可能会被不正确的优化掉;有了这个volatile声明,则语意为: AA是一个外部变量;它的值不允许在本单元修改;但其他单元可能随时修改这个值,因而不允许执行常量优化。

(我没有试过能否在a.c中将AA定义为volatile const,然后在b.h中将其当作普通外部变量引用——理论上这么做是完全可以的。但一旦这样做了,须注意a.c中必须加volatile修饰AA。否则编译器优化后,就可能把AA替换为立即数200,于是导致外部对AA的任何修改都反映不到a.c执行逻辑中)


事实上,c/c++中改变变量访问权限的情况极为常见;如string内部存储区指针显然不是const,但用c_str()取得的指针却是const。

总结: const类似于public/private,它的意思是去掉当前代码块对指定变量的写权限。



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
davycu
精灵王



UID:597081
注册:2007-8-6
最后登录: 2008-10-07
帖子:295
精华:0

可用积分:883 (稍有积蓄)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


6楼 发表于 2008-7-14 17:49 
C/C++中const用的很多,但是总让人犯迷糊。总结下它的用法,如果说的不对还请指正。
1、const修饰的后的对象不是一个常量,它只表示修饰的对象是个只读的对象。
可以用下面的方法证明:
const int a = 1;

switch(i)
{
    case a: ... break;
    case 2: ... break;
    default: ... break;
}
如果i等于1,不会执行case a: 后面的语句。
-----------------------------------------------------
昨晚刚看了几页中文版C++ primer, 貌似const一节里就把const变量称为常量啊,我还在想这和宏有何区别呢

哎,C++还真复杂,想学又有点怕怕



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

明月出天山,苍茫云海间。
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
tyc611   帅哥 (?)
大法师
苦海无边



CU奥运火炬传递手2008
UID:372261
注册:2006-2-14
最后登录: 2008-10-06
帖子:8532
精华:7

可用积分:5406 (富足长乐)
信誉积分:210
专家积分:143 (本版:25)
空间积分:822
推广积分:7

状态:...离线...

[个人空间] [短信] [博客]


7楼 发表于 2008-7-14 18:13 
LZ说的应该是C++的情况



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

----
想想
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
tyc611   帅哥 (?)
大法师
苦海无边



CU奥运火炬传递手2008
UID:372261
注册:2006-2-14
最后登录: 2008-10-06
帖子:8532
精华:7

可用积分:5406 (富足长乐)
信誉积分:210
专家积分:143 (本版:25)
空间积分:822
推广积分:7

状态:...离线...

[个人空间] [短信] [博客]


8楼 发表于 2008-7-14 18:19 


QUOTE:
原帖由 davycu 于 2008-7-14 17:49 发表
昨晚刚看了几页中文版C++ primer, 貌似const一节里就把const变量称为常量啊,我还在想这和宏有何区别呢

哎,C++还真复杂,想学又有点怕怕

宏替换所得的是字面值常量(不是可寻址的变量),而const变量是具有常量性质的变量(可寻址,特别地,C++也允许编译器在合理的情况下直接进行与宏相似的常量替换,此时可能在编译后不会有该const变量对象存在)



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

----
想想
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
davycu
精灵王



UID:597081
注册:2007-8-6
最后登录: 2008-10-07
帖子:295
精华:0

可用积分:883 (稍有积蓄)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


9楼 发表于 2008-7-14 18:38 


QUOTE:
原帖由 tyc611 于 2008-7-14 18:19 发表

宏替换所得的是字面值常量(不是可寻址的变量),而const变量是具有常量性质的变量(可寻址,特别地,C++也允许编译器在合理的情况下直接进行与宏相似的常量替换,此时可能在编译后不会有该const变量对象存在)

你说的这个好像跟C没区别啊



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

明月出天山,苍茫云海间。
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
tyc611   帅哥 (?)
大法师
苦海无边



CU奥运火炬传递手2008
UID:372261
注册:2006-2-14
最后登录: 2008-10-06
帖子:8532
精华:7

可用积分:5406 (富足长乐)
信誉积分:210
专家积分:143 (本版:25)
空间积分:822
推广积分:7

状态:...离线...

[个人空间] [短信] [博客]


10楼 发表于 2008-7-14 19:02 


QUOTE:
原帖由 davycu 于 2008-7-14 18:38 发表


你说的这个好像跟C没区别啊

它们是有区别的,不过,我现在也只记得C++中的情况了,期待本版的权威人士予以解答



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

----
想想
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?

首页 » 论坛 » C/C++ »


 


Copyright © 2001-2008 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - ChinaUnix - Archiver - WAP - TOP

Processed in 0.155744 second(s), 5 queries , Gzip enabled