c++ const成员函数的纠结
来源:互联网 发布:java集合类是干啥的 编辑:程序博客网 时间:2024/06/01 10:06
const的美妙在于它能让你规定一个语义上的常量。应该尽可能地在代码中使用它,全局作用域,命名空间内,类里面都可以使用, 不管是静态还是非静态的对象,你都可以使用它。
一个const对象,它只能调用const函数。因为非const函数,可能会修改这个对象。因此,如果一个成员函数,它不会修改任何非static 成员数据,你应该声明为const。比如:
class String { public: char& operator[](int position) { return data[position]; } const char& operator[](int position) const { return data[position]; }private: string *data;};
然而,世事不遂人愿。考虑一下代码:
class String { public: char& operator[](int position) const { return data[position]; }private: char *data;};const String BillGates = "employer";BillGates[7] = 'e';cout << BillGates << endl;
结果是BillGates从employer变成了employee,这不是我们期望的。一个const对象,调用一个const函数,结果把对象修改了, 你觉得这很荒唐。C++也觉得自己很委屈,因为函数确实没有修改成员数据,符合const成员函数规则。它是如此顺利地通过C++编译器的安检,没有任何的警报,看似风平浪静,实则暗藏杀机 。既然如此,难道就无解了吗?不,你只需要将char& 改成const char&即可。
问题是解决了,却牵扯出一个问题,那就是究竟如何看待const。话说,一时众说纷纭,形成两派主流:bitwise派和logic派。bitwise认为, const应该不能修改对象实体;而logic派则认为,只要客户端看不出修改即可,真正实现可以有修改对象实体。C++选择了bitwise派, 毕竟实现起来也容易的多。logic派甚为不服,给出以下例子,代码如下:
class String {public: size_t length() const;private: char *data; size_t dataLength; bool lengthIsValid;};size_t String::length() const{ if (!lengthIsValid) { dataLength = strlen(data); // error! lengthIsValid = true; // error! } return dataLength;}
length()仅仅是求String的长度,声明为const无可厚非;为了高效应对频繁查询,缓冲长度数据也合情合理。然而就这人畜无害的 代码,C++编译器不让通过。
啊,这真是让C++为难!可修改对象,还是不可修改对象,这是个问题,是个纠结的问题。如果选择logic派,那const形同虚设。也许Bjarne Stroustrup应该学习 Dennis Ritchie那样,相信程序员所写的代码。Bjarne Stroustrup心里知道,因为这点,无数程序员受尽了C语言的折磨。哪有人不犯错呢,他不能那么做。 然而logic派所言也并非没有道理,该怎么办呢?Bjarne Stroustrup在房间里踱来踱去,他拿不定主意。
mutable出场了。C++决定依然坚持bitwise派,同时提供mutable让logic派能够实现他们的愿望。于是乎,上面的代码就可以这么写了:
class String {public: size_t length() const;private: char *data; mutable size_t dataLength; mutable bool lengthIsValid;};size_t String::length() const{ if (!lengthIsValid) { dataLength = strlen(data); // ok lengthIsValid = true; // ok } return dataLength;}
终于,代码通过了编译器的安检,C++编译器是开开心心地产出目标指令。
参考:《ffective C++》
- c++ const成员函数的纠结
- c++const成员函数
- c/c++中const成员函数的返回值类型
- C++:在成员函数后面放const的作用
- const 之 const修饰的成员函数
- const成员函数的使用
- 类的 const 成员函数
- 成员函数后面的const
- 类的const成员函数
- 类的const成员函数
- const修饰的成员函数
- const类型的成员函数
- 成员函数后的const
- 类的const成员函数
- 高质量c++(const成员函数)
- 高质量c++(const成员函数)
- 高质量c++(const成员函数)
- 高质量c++(const成员函数)
- Revise .profile and install pip.
- 一个很不错的博客,说了很多图形学的基础知识
- django,mysql存储emoji表情,utf8mb4
- @property关键字和参数详解
- c++实现aes加密算法,对字符串进行加密
- c++ const成员函数的纠结
- 技术团队的聚散离合--案例故事,献给曾经的团队
- P1034 家族
- 2015 for me it can be change改变自己
- 一个IT从业者2014的改变和思考
- 登录界面中的textbox提示字段的实现
- 牛腩新闻发布系统(三)--母版
- python利用多核CPU实现mapreduce
- 测试不同浏览器播放canvas动画的平滑程度