免费注册 查看新帖 |

Chinaunix

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

const,C/C++的第一个败笔 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-04 17:16 |只看该作者 |倒序浏览
经过越来越多的教训,偶不得不说,const,是C/C++历史上最失败的发明

首先,const侮辱了程序员的智商。C/C++的精髓之一既是,相信程序员的能力,
const却说,你程序员是容易出错的,我来帮你编译时把把关。

const一边侮辱着程序员的智商,一般又出尔反尔,笑里藏刀般给出某种妥协,
对了,还有强制类型转换,还有const_cast。你看到的是const,未必是const的。

其次,const严重削弱了编写C++代码的乐趣。写个
Object &GetSubObject()吧,不行,你可能还要再写一个
Object const &GetSubObject() const,
你竟然发现两个代码一样呢,多么愚蠢的做法!

不知道发明STL的人,有没对const恨的咬牙切齿呢!
当我第一次接触STL,发现iterator很好用,
但是当我再看到const_interator时,我想STL的作者一定在牙痒吧。。
当再看到又冒出来一个const_reserver_interator时,心想如果我是STL的作者,一定会咆哮了。。

如果要写C++ template,就更糟糕了,对于类型int const和int,
竟然需要不同的偏特化。偏特化的代码,几乎一样吧,没错了,
都是const惹的祸。

最新写一个templatge,对 pair<A, B>做偏特化,
当我发现不得不对
pair<A,B>
pair<const A, B>
pair<A, const B>
const pair<A, B>
const pair<const A, B>
const pair<A, const B>
六种情况逐一处理时, 我彻底的崩溃了。。

const,你就不能安静的移出C/C++标准吗?

[ 本帖最后由 芙蓉 于 2008-1-4 17:40 编辑 ]

评分

参与人数 1可用积分 +5 收起 理由
langue + 5 原创内容

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2008-01-04 17:44 |只看该作者
好文,顶一下。

论坛徽章:
0
3 [报告]
发表于 2008-01-04 17:55 |只看该作者
支持一下。

论坛徽章:
0
4 [报告]
发表于 2008-01-04 17:57 |只看该作者
sorry,
最后一段有8种情况
pair<A,B>
pair<const A, B>
pair<A, const B>
pair<const A, const B>
const pair<A, B>
const pair<const A, B>
const pair<A, const B>
const pair<const A, const B>

论坛徽章:
0
5 [报告]
发表于 2008-01-04 18:21 |只看该作者
对啊,很同意LZ的看法。

论坛徽章:
0
6 [报告]
发表于 2008-01-04 20:50 |只看该作者
>> 经过越来越多的教训,偶不得不说,const,是C/C++历史上最失败的发明

在 C 语言产生之初,并没有 const 关键字。const 的引入是在 C 标准化的时候。你的这种论调是在怀疑制定标准的那些人以及站在他们身后的无数的程序员们的智慧。如果不是想故意哗众取宠,那就是说这话的人还没有真正掌握 const 的使用,还没有体会到 const 在 C/C++ 程序中的重要作用。

一般是语言初学者或者无甚编程经验的人才会持有这种观点。如果经过一定时间的编程之后还没有在自己的 C/C++ 程序中有意识地使用 const,那真应该深刻自我反思一下。

>> 首先,const侮辱了程序员的智商。C/C++的精髓之一既是,相信程序员的能力,const却说,你程序员是容易出错的,我来帮你编译时把把关。

与机器相比,人是不可靠的,这是人所共知的定论,对此没有什么可值得怀疑的——机器能做以及容易做的事还是交给机器来处理好了。

人们总希望编译器能发现尽量多的程序错误,甚至不惜借助于一些专门的工具。还有,你写的程序可能还要交给他人去测试,明显是不相信你嘛。是不是这样做都会“侮辱”你的智商?

>> const一边侮辱着程序员的智商,一般又出尔反尔,笑里藏刀般给出某种妥协,对了,还有强制类型转换,还有const_cast。

语言中某种特性存在,自然有它的用途,但是并不是说你一定要使用它。const_cast 就是这样的:可能在你的程序中永远都不会用到它;但是假设你用到的一个库函数是类似这样的 int my_strlen( char* s ); 不规范声明,要用它来求 const char* p; 这样定义的 p 指向的字符串的长度,const_cast 就会派上用场了(当然,也可以用强制转换)。

>> 你看到的是const,未必是const的。

你想说的是未必是 constant (常量)或者不可改变的吧?确实是这样的,有什么问题吗?

>> 其次,const严重削弱了编写C++代码的乐趣。

我承认你后面说的问题确实存在,它们可视为引入 const 之后产生的“副作用”。const 就如同现实中的药,当它有疗效的时候人们就会使用它,即使它有些副作用。何况 C/C++ 中的 const 带来的“效益”远远大于它的“副作用”,所以它被引入了。

>> const,你就不能安静的移出C/C++标准吗?

不能。因为那样做会因小失大,智者不为也。

与其写这样观点狭隘的文章,建议你以“如果 C/C++ 中缺了 const 会怎样”为题深入探讨 const 一番,写出一篇值得称道的好文章来。如此幸甚。

论坛徽章:
0
7 [报告]
发表于 2008-01-04 21:04 |只看该作者
LS说的不错
不过我也很少使用const(C)
除了const char *参数,不过我几乎从来没有写过试图更改这个参数的代码,所以有没有const对我本人的影响几乎为0

加个cons过好处还是很明显的

论坛徽章:
0
8 [报告]
发表于 2008-01-04 21:35 |只看该作者
你说C/C++,  我怎么感觉你说的全是C++里的情况?
“编译时把把关”就是“侮辱了程序员的智商”, 这句话实在不敢苟同。

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
9 [报告]
发表于 2008-01-04 21:37 |只看该作者
原帖由 flw2 于 2008-1-4 21:04 发表
LS说的不错
不过我也很少使用const(C)
除了const char *参数,不过我几乎从来没有写过试图更改这个参数的代码,所以有没有const对我本人的影响几乎为0

加个cons过好处还是很明显的

最近开始注意用const char *参数

论坛徽章:
0
10 [报告]
发表于 2008-01-04 21:57 |只看该作者
好邪恶,好强大哦
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP