[EffectiveC++]item03:尽可能使用const 并且转载一篇关于const函数的博客
速度
#include <iostream>
using namespace std;
class TextBlock
{
private:
string text;
public:
TextBlock(string s)
{
text = s;
}
const char& operator[](size_t position) const
{return text[position]; } char& operator[](size_t position)
{return text[position]; }
};
int main()
{
TextBlock tb("hello");
const TextBlock ctb("world");
cout << tb[0];
cout << ctb[0];
return 0;
}
关于其中的:const char& operator[](size_t position) const
第一个const要是不带的话会报:error: invalid initialization of reference of type ‘char&’ from expression of type ‘const char’
难道认为text[position]是个const char了 因为第2个const ??
第2个const的作用是为了重载函数 Mar 14,2014
关于第1个const找到一个好解释:对于const函数,如果返回值为引用,则必须返回Const引用 ,如果返回的是指针或者一般值,就不需要了
详细参见 http://bbs.csdn.net/topics/390731394?page=1#post-396953946
2)iterator认为是一个T*,这个是一个封装了的指针。所以const iterator意味着是常指针。const_iterator 意味着const T* :指向的内容不可变,这个与const iterator是相反的。

再转一个const的blog
C++中const重载
众所周知,C++实现函数重载有两种情况:函数参数的类型不同,参数的个数不同。而与函数的返回值没有什么关系。
需要注意的是在如下情况下:
- float f1(float a, float b)
- {
- //
- }
- flaot f1(float a, float b, float c = 0)
- {
- //
- }
下面的调用会产生歧义:
- f1(2.0, 2.0);
言归正传,看下面一段代码:取自Effective C++
- class TextBlock {
- public:
- ...
- const char& operator[] (std::size_t position) const
- {return text[position];}
- char& operator[] (std::size_t position)
- {return text[position];}
- private:
- std::string text;
- }
- TextBlock tb("Hello");
- std::cout << tb[0];
- const TextBlock ctb("World");
- std::cout << ctb[0];
const char& operator[] (std::size_t position) const
后一个const参与对重载函数的区分,这样在参数类型个数相同的情况下形成一种新的重载形式。
需要注意:常成员函数是常对象唯一的对外接口,使用使应该注意。常成员函数不能更新对象的数据成员,也不能调用该类中的普通成员函数。
这就是为什么const TextBlock ctb("World");会调用const char& operator[] (std::size_t position) const;的原因,包含了C++的隐式调用。
const常量函数it |
分类: C/C_plus_plus |
今天在做一个趋势笔试题的时候,才让我有了系统把const关键字好好总结一下的冲动,因为这个关键词大大小小好多地方都出现过,出现频率非常高,而每次只是简短的把答案看了一下,没有真正将其整个用法弄透,马上要找工作了,为避免悲剧再次发生,不得不引起我的重视,这才有了这篇博文。
4) 然而加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的const成员函数是可以修改它的
[EffectiveC++]item03:尽可能使用const 并且转载一篇关于const函数的博客的更多相关文章
- 转载: 使用vue全家桶制作博客网站 HTML5 移动网站制作的好教程
使用vue全家桶制作博客网站 前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用vue全家桶制作的博客网站 概述 该项目是基于vue全家桶(vue. ...
- 几篇不错的基础css博客转载
CSS 巧用 :before和:after:http://web.jobbole.com/85083/ css清除元素间距:http://ouvens.github.io/frontend-css/2 ...
- python 下划线的使用(转载:安生犹梦 新浪博客)
Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx 不能用'from module import *'导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核 ...
- Swift中可选类型(Optional)的用法 以及? 和 ! 的区别 (转载博客,知识分享)
本文转载自:代码手工艺人的博客,原文名称:Swift之 ? 和 ! Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之 ...
- [EffectiveC++]item3:尽可能使用const
将某些东西声明为const可以帮助编译器检测出错误用法,const 编译器强制实施bitwise constness,但是你code的时候应该使用“概念上的常量性” 当const和non-const成 ...
- 转载----C/C++ 中 const 修饰符用法总结
感谢原创作者,写的好详细.不忍错过,所以转载过来了... 原文地址: https://www.cnblogs.com/icemoon1987/p/3320326.html 在这篇文章中,我总结了一些C ...
- 转载:string、const char*、 char* 、char[]相互转换
本文转自:https://blog.csdn.net/rongrongyaofeiqi/article/details/52442169 一:转化总结形式如下: 使用时,要对源格式和目标格式进行初始化 ...
- 好文推荐:转载一篇别人kaggle的经验分享
转载:https://www.toutiao.com/i6435866304363627010/ 笔者参加了由Quora举办的Quora Question Pairs比赛,并且获得了前1%的成绩.这是 ...
- Trie树(c++实现)——转载自jihite的博客
Trie树(c++实现) 原理 先看个例子,存储字符串abc.ab.abm.abcde.pm可以利用以下方式存储 上边就是Trie树的基本原理:利用字串的公共前缀来节省存储空间,最大限度的减少无谓 ...
随机推荐
- ASP.NET MVC Core的TagHelper(基础篇)
TagHelper又是一个新的名词,它替代了自之前MVC版本的HtmlHelper,专注于在cshmlt中辅助生成html标记. 通过使用自定义的TagHelper可以提供自定义的Html属性或元素, ...
- mysql备份 小结 (三种方式的详细解读)
备份的本质就是将数据集另存一个副本,但是原数据会不停的发生变化,所以利用备份只能回复到数据变化之前的数据.那变化之后的呢?所以制定一个好的备份策略很重要 新建一个all.sqlvim all.sql在 ...
- [转]Http请求中Content-Type讲解以及在Spring MVC中的应用
本文转自:http://blog.csdn.net/blueheart20/article/details/45174399 引言: 在Http请求中,我们每天都在使用Content-type来指定不 ...
- MVC缓存(一)
//OutputCache是设置缓存,参数Duration设置缓存的过期时间,OutputCache可以加到Controller上,也可以加到Action上,但是当Controller与Action都 ...
- n后问题
Description 在n×n格的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇 ...
- 关于vue.js中slot的理解
slot这块看官网文档,起初有点不懂,仔细研究还是最终理解了,slot是用来干嘛的呢,先看下一个例子: <script src="https://unpkg.com/vue/dist/ ...
- Cheatsheet: 2018 11.01 ~ 2019 02.28
Golang FromXToGo micro - A microservice toolkit Other Easy parsing of Excel spreadsheet format with ...
- 网络安全之——DNS欺骗实验
---------------发个帖证明一下存在感,希望各位大牛们,别喷我!!谢谢-------------- DNS(域名系统)的作用是把网络地址(域名,以一个字符串的形式) ...
- Visual studio 2013打开报异常"Exception has been thrown by the target of an invocation"
最近遇到一个问题,打开VS2013和SQL Server2014都会出报错,错误信息如下: 以前都是好好的,重启了机子也不行,能打开两个VS,再打开第三个VS还是会报错,百度无果,还是在google上 ...
- python学习之老男孩python全栈第九期_day025知识点总结——接口类、抽象类、多态、封装
一. 接口类 java:面向对象编程 设计模式 -- 接口类 接口类:python原生不支持 抽象类:python 原生支持的 from abc import abstractclassmethod, ...