免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3127 | 回复: 11
打印 上一主题 下一主题

关于const的用法的不解? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-30 22:25 |只看该作者 |倒序浏览
以下内容是引用:
C++ Primer读书笔记
作者:neplusultra linuxsir (2005-03-23 16:44:27)

 1、下面是一个几乎所有人刚开始都会搞错的问题:
已知:typedef char *cstring;
在以下声明中,cstr的类型是什么?
extern const cstring cstr;

错误答案:const char *cstr;
正确答案:char *const cstr;

  错误在于将typedef当作宏扩展。const 修饰cstr的类型。cstr是一个指针,因此,这个定义声明了cstr是一个指向字符的const指针。

问题:extern const cstring cstr;理解成了char *const cstr;
那“extern cstring const cstr;”怎么理解???

[ 本帖最后由 usbboy 于 2006-3-30 22:35 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-03-30 22:33 |只看该作者
以下是引用:
2、指针是const还是data为const?
辨别方法很简单,如下:

代码:
char *p="hello"; //non-const pointer, non-const data;
const char *p="hello"; // non-const pointer, const data;
char * const p="hello"; // const pointer , non-const data;
const char * const p="hello"; // const pointer, const data;



  要注意的是,"hello"的类型是const char * ,按C++standard规则,char *p="hello" 是非法的(右式的const char* 不能转换为左式的char *),违反了常量性。但是这种行为在C中实在太频繁,因此C++standard对于这种初始化动作给予豁免。尽管如此,还是尽量避免这种用法。


问题:const char * 为什么不能转换为左边char *,什么叫违反常量性???
=号左边是个变量 右边是个常量,这样赋值都不行的话,常量还怎么用。。。 让人费解

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2006-03-30 22:59 |只看该作者
1。我认为extern cstring const cstr和extern const cstring cstr是一样的。
2。char *p="hello";
右边是一个const char *类型的,也就是你不能去修改它指向的数据。
左边是char *类型的,你可以通过指针去修改数据。
现在你把const char *类型的指针赋给了char *类型的指针,
那你就可以通过char *指针来修改它指向的数据。
你说这样做不对吧?

论坛徽章:
0
4 [报告]
发表于 2006-03-30 23:09 |只看该作者
原帖由 lenovo 于 2006-3-30 22:59 发表
1。我认为extern cstring const cstr和extern const cstring cstr是一样的。
2。char *p="hello";
右边是一个const char *类型的,也就是你不能去修改它指向的数据。
左边是char *类型的,你可以通过 ...

那const char *cstr; 没法用ctring实现了。。。 故意让人费解的规则

关键在于编译器怎么理解char *p="hello";
如果是实现深拷贝 就没有这个问题
好像实现浅拷贝的编译器都把
char *P=“hello";理解成 const char *p="hello",这样就不存在修改问题了

[ 本帖最后由 usbboy 于 2006-3-30 23:11 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2006-03-30 23:14 |只看该作者
我没理解这个和深拷贝和浅拷贝有什么关系。
还有”const char *cstr; 没法用ctring实现了“这个也让我费解。

论坛徽章:
0
6 [报告]
发表于 2006-03-30 23:20 |只看该作者
原帖由 lenovo 于 2006-3-30 23:14 发表
我没理解这个和深拷贝和浅拷贝有什么关系。
还有”const char *cstr; 没法用ctring实现了“这个也让我费解。


很简单深拷贝
char *p="hello";
实现的是
const char *temp="hello"
char *p=new char[strlen(temp)];
strcpy(p,temp);

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
7 [报告]
发表于 2006-03-30 23:35 |只看该作者
原帖由 usbboy 于 2006-3-30 23:20 发表


很简单深拷贝
char *p="hello";
实现的是
const char *temp="hello"
char *p=new char[strlen(temp)];
strcpy(p,temp);

干嘛要深拷贝?
你根本没理解char *p="hello";是什么意思。

论坛徽章:
0
8 [报告]
发表于 2006-03-30 23:46 |只看该作者
原帖由 lenovo 于 2006-3-30 23:35 发表

干嘛要深拷贝?
你根本没理解char *p="hello";是什么意思。

就是把一个字符串常量赋与一个字符串指针
或着用一个字符串常量来初始化字符串指针
绝对不能只是理解 成把 指针=指针

我要说的意思就是这个语句可以2种实现
1。深拷贝(值传递方式) 2。浅拷贝 (地址传递方式)
至于说为什么要深拷贝 就是要与你说的常量规则相符
这里必须把p理解成一个数组 不能理解成一个单一的指针

[ 本帖最后由 usbboy 于 2006-3-30 23:52 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
9 [报告]
发表于 2006-03-30 23:58 |只看该作者
原帖由 usbboy 于 2006-3-30 23:46 发表

就是把一个字符串常量赋与一个字符串指针
或着用一个字符串常量来初始化字符串指针
绝对不能只是理解 成把 指针=指针

我要说的意思就是这个语句可以2种实现
1。深拷贝(值传递方式) 2。浅拷贝 (地址传 ...

建议你去看一下c的语法书。

论坛徽章:
0
10 [报告]
发表于 2006-03-31 00:09 |只看该作者
原帖由 lenovo 于 2006-3-30 23:58 发表

建议你去看一下c的语法书。

编译系统的实现不是一样的 晕
你说的意思我知道 我只是说可以用别的方法来完善规则

就好像函数本身降低了程序时间效率却提高了空间效率 哪有十全十美的事
规则是死的人是活的 就好比class要封装 但c++并没有禁止友员friend,全局变量等机制方便外部访问
char *p="hello"也不是说只能用浅拷贝实现,
用深拷贝实现虽然效率上没必要 却与c++的常量规则想符
把char *p="hello"隐含解释成const char *p="hello"当然最好,效率概念都符合

[ 本帖最后由 usbboy 于 2006-3-31 00:11 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP