effective C++ 3 use const whenever possible
2014-04-01 10:05
239 查看
const一直是个我记不太清楚的东西,这一节内容还挺多,希望自己可以记住。
首先是const指针的问题,到底指针是const,还是指针指向的东西是const。这里提供了一条很简单的法则,那就是看const出现在星号*的左边还是右边:const在*左边,那就是指向的东西是const,如果在*右边,那就是指针本身是个const。
比如
STL的迭代器和指针差不多,所以也有上面的规则。
下面是const在关于函数声明时的应用。
首先可以让函数的返回值是一个const,借用原文中的例子:
因为操作符返回的是const,所以就很容易避免类似下面这种错误:
if(a*b==c)时不小心笔误漏掉了一个=,写成了if(a*b=c)。
下面再看一下const成员函数:
因为const成员函数是不修改对象的成员变量的,所以把一个成员函数定为const是为了确认其可以作用于const对象。
如果需要在const成员函数里修改成员变量,可以在可能被修改的成员变量前加上mutable,这样const成员函数就可以修改这个变量了。
如果两个成员函数仅仅是const不同(一个是const,一个不是),那么是可以被重载的。假如说这两个成员函数完成的事情是一样的,仅仅是const的区别,为了避免重复,可以在non-const函数里调用const函数,如下:
去除const只能由const_cast来完成,这个以及其他cast的用法似乎后面也会讲到。
需要注意的是不能在const里面调用non-const函数。
首先是const指针的问题,到底指针是const,还是指针指向的东西是const。这里提供了一条很简单的法则,那就是看const出现在星号*的左边还是右边:const在*左边,那就是指向的东西是const,如果在*右边,那就是指针本身是个const。
比如
char test[] = "test"; const char *p = test; //non-const pointer, const data char* const p = test; //const pointer, non-const data
STL的迭代器和指针差不多,所以也有上面的规则。
下面是const在关于函数声明时的应用。
首先可以让函数的返回值是一个const,借用原文中的例子:
class Rational { ... }; const Rational operator* (const Rational& lhs, const Rational& rhs;
因为操作符返回的是const,所以就很容易避免类似下面这种错误:
if(a*b==c)时不小心笔误漏掉了一个=,写成了if(a*b=c)。
下面再看一下const成员函数:
因为const成员函数是不修改对象的成员变量的,所以把一个成员函数定为const是为了确认其可以作用于const对象。
如果需要在const成员函数里修改成员变量,可以在可能被修改的成员变量前加上mutable,这样const成员函数就可以修改这个变量了。
如果两个成员函数仅仅是const不同(一个是const,一个不是),那么是可以被重载的。假如说这两个成员函数完成的事情是一样的,仅仅是const的区别,为了避免重复,可以在non-const函数里调用const函数,如下:
class TextBlock { const char & operator[] (std::size_t position) const { return text[position]; } char operator[] (std::size_t position) { return const_cast<char&>( //去掉const static_cast<const TextBlock&>(*this) //为*this加上const [position] //调用const op[] ); } ... }
去除const只能由const_cast来完成,这个以及其他cast的用法似乎后面也会讲到。
需要注意的是不能在const里面调用non-const函数。
相关文章推荐
- C++中覆盖和隐藏
- C++一次性读入整个文件
- C++对于二进制文件的读写文章转载
- 伸展树(二)之 C++的实现
- c++开源项目汇总
- vector中的reserve和resize的区别
- 【坐在马桶上看算法】算法7:Dijkstra最短路算法 推荐
- HDU 1001
- HDU 1000
- C++的Json解析库:jsoncpp和boost
- 分离链接散列表C语言实现实例
- C语言结构体里的成员数组和指针
- C++笔记:面向对象编程(Visual)
- 七大主流排序算法时间效率比较(基于C语言)
- c语言基础复习二之零碎预科
- C/C++开发android应用
- C++全局变量构造函数的调用
- [算法] 高斯消元法 列主消元法 C++ 代码
- using与命名空间
- CvvImagecpp