[EffectiveC++]item3:尽可能使用const
将某些东西声明为const可以帮助编译器检测出错误用法,const
编译器强制实施bitwise constness,但是你code的时候应该使用“概念上的常量性”
当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可以避免代码重复。
0)迭代器类似T*指针,声明迭代器为const就像声明指针为const一样。(即声明一个T* const指针)
如果你希望迭代器所指的不能被改动,需要的是const_iterator
vector<int>::iterator iter = vec.begin();//iter作用像T* const
*iter = 10;//没问题,改变iter所指物
iter++;//错误,iter是const
vector<int>::const_iterator cIter = vec.begin();//作用像const T*
*cIter = 10;//错误 *cIter是const
iter++;//OK
返回值为const 防止(a*b)=c;这样的暴行
1)const成员函数之所以重要,因为a)知道哪个函数可以改动对象内容;b)使得“操作const对象”成为可能。
两个成员函数如果只是常量性(constness)不同,可以被重载。
#include <iostream>
#include <string.h>
using namespace std;
class TextBlock
{
private:
char text[256];
public:
TextBlock(char *input)
{
strcpy(text,input);
}
//!!!REMEMBER IT!!!!
//operator[] for const object
const char& operator[](std::size_t position) const
{
cout << "now in the const member\n";
return text[position];
}
//operator[] for non-const object
char& operator[](std::size_t position)
{
cout << "now in the non-const member\n";
return text[position];
}
};
int main()
{
TextBlock tb("hello");
cout << tb[0] <<'\n';
const TextBlock ctb("world");
cout << ctb[0] <<'\n';
return 0;
}
now in the non-const member
h
now in the const member
w
2)在const和non-const成员函数中避免重复
class TextBlock
{
public:
const char& operator[](size_t position) const
{ //bounds checking,log access data,verify data integrity...
return text[position];
}
char& operator[](size_t position)//现在只调用const op[]
{
return const_cast<char&>(//将op[]返回值的const转除
static_cast<const TextBlock&>(*this)[position]);//为*this加上const调用const op[]
}//代码写的真巧妙,我这辈子估计都写不出这么巧妙的代码了。。。。
};
[EffectiveC++]item3:尽可能使用const的更多相关文章
- Effective C++ 之 Item 3:尽可能使用 const
Effective C++ Chapter 1. 让自己习惯C++(Accustoming Yourself to C++) Item 3. 尽可能使用 const (Use const whenev ...
- [EffectiveC++]item03:尽可能使用const 并且转载一篇关于const函数的博客
速度 #include <iostream> using namespace std; class TextBlock { private: string text; public: Te ...
- C++ const用法 尽可能使用const [转载]
C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的.如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助. 1.c ...
- 尽可能使用 const
前言 const 关键字是常量修辞符,如果要告知编译器某个变量在程序中不会发生改变,则可将其声明为 const. 但,对 const 关键字的认识不能仅仅停留在这一层 - 它提供了很多更强大的功能. ...
- C++ const用法 尽可能使用const
C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的.如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助. 1.c ...
- 【转】C++ const用法 尽可能使用const
http://www.cnblogs.com/xudong-bupt/p/3509567.html C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不 ...
- 第二篇:尽可能使用 const
前言 const 关键字是常量修辞符,如果要告知编译器某个变量在程序中不会发生改变,则可将其声明为 const. 但,对 const 关键字的认识不能仅仅停留在这一层 - 它提供了很多更强大的功能. ...
- Effective C++ -----条款03:尽可能使用const
如果关键字const出现在星号左边,表示被指物是常量:如果出现在星号右边,表示指针自身是常量:如果出现在星号两边,表示被指物和指针两者都是常量. char greeting[] = " he ...
- 【03】尽可能使用const
1.为什么搞出const关键字? const指定一个语义约束,指定一个对象不可修改.如果一个对象不可修改,就应该说出来. 2.const与指针 const可以修饰指向之物,也可以修改指针本身.STL中 ...
随机推荐
- 请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧---转
http://www.iteye.com/topic/774673 羞愧呀,不知道多少人干过,我也干过,面壁去! 这帖是用来回复高级语言虚拟机圈子里的一个问题,一道Java笔试题的. 本来因为见得太多 ...
- Netty(1):第一个netty程序
为什么选择Netty netty是业界最流行的NIO框架之一,它的健壮型,功能,性能,可定制性和可扩展性都是首屈一指的,Hadoop的RPC框架Avro就使用了netty作为底层的通信框架,此外net ...
- 屏幕置顶(WindowManager服务)
https://www.cnblogs.com/mythou/p/3244208.html
- JAVA基于权重的抽奖
https://blog.csdn.net/huyuyang6688/article/details/50480687 如有4个元素A.B.C.D,权重分别为1.2.3.4,随机结果中A:B:C:D的 ...
- JavaScript数组的三种定义方法
数组的定义: <script type="text/javascript"> // <!--声明数组--> // 1.先声明数组长度,后进行赋值 var a ...
- 第10天:apply和call、bind、函数作为参数、返回值使用、闭包、递归的样例
apply和call apply和call都可以改变this的指向 函数的调用,改变this的指向 函数名字.apply(对象,[参数1,参数2,.....]) 方法名字.apply(对象,[参数1, ...
- asp.netCore连接多个数据库
1.首先要有对应的context实体类, 多个实体类的构造函数的参数都应该是集合 public class firstContext : DbContext { //多个数据库应该使用这个构造函数,参 ...
- 微信小程序通过CODE换取session_key和openid
微信小程序的用户信息获取需要请求微信的服务器,通过小程序提供的API在小程序端获取CODE,然后将CODE传入到我们自己的服务器,用我们的服务器来换取session_key和openid. 小程序端比 ...
- 撩课-Web大前端每天5道面试题-Day13
1.前端需要注意哪些SEO? 合理的title.description.keywords:搜索对着三项的权重逐个减小,title值强调重点即可,重要关键词出现不要超过2次,而且要靠前,不同页面titl ...
- arguments 参数
下面要写的是知识梳理的一个案例: 写一个求和的方法sumFn,不管传递的参数有什么,都能将最终的和算出来,并且返回给函数外部使用.(要求:一个参数都不传默认结果为0,对于传递的非正常数字的参数不与累加 ...