[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树的基本原理:利用字串的公共前缀来节省存储空间,最大限度的减少无谓 ...
随机推荐
- 快捷键 -- windows
win+数字 : 打开任务栏第n个图标 Win+D :快速显示桌面 Win+R :快速运行打开软件 例如 cmd services,msc Win+E:打开资源管理器 Win+L:快速锁定计算机 ...
- [作业] Python入门基础---购物车小程序
1.购物车小程序: 1.1用户输入工资取60% 1.2打印输出商品菜单 1.3由用户输入数字选择 #__author:Mifen #date: 2018/11/27 # 购物车程序 #把工资作为账户的 ...
- shell脚本生成服务器密码
#!/bin/bash len=90 str=(a b c d e f g h i j k l m n o p q r s t u vw x y z A B C D E F G H I J K L M ...
- audio标签的自动播放(ios)
0.应用场景 前端移动端开发,经常有播放音乐的需求.比如我有公司做过类似支付宝的年度账单,功能是用户在查看年度账单的过程中播放轻音乐. 1.audio标签播放mp3 (一)常用属性和API介绍 1.c ...
- 初识DataGridView 表格数据控件
DataGridView控件提供了一种强大而灵活的以表格形式显示数据的方式,用户可以使用DataGridView控件来显示少量数据的只读视图,也可以对其进行缩放以显示特大数据集的可编辑视图. 扩展Da ...
- 关于UI回调Invoker的实现(一)
打算写一个DirectUI库,在写其中底层窗口的回调构造的时候遇到一个问题. Invoker是一个模板,因为closure的关系,它必须保存一个类对象的指针,和回调函数的地址.而函数调用的时候,就可以 ...
- firefox并不支持selectSingleNode和selectNodes的解决方法
转自:http://qsrock.iteye.com/blog/209585 function test(){ var perid = document.thisForm.PerID.value; v ...
- MongoTemplate基本操作
本文基于spring boot项目,快速构建项目请参考:https://www.cnblogs.com/lay2017/p/8836273.html 添加mongo依赖 <dependency& ...
- 撩课-Java每天5道面试题第20天
131.Spring是什么? 他解决的是业务逻辑层和其他各层的松耦合问题, 因此它将面向接口的编程思想 贯穿整个系统应用. Spring是一个轻量级的IoC和AOP容器框架. 目的是解决企业应用开发的 ...
- HBase性能优化方法总结
1. 表的设计 1.1 Pre-Creating Regions 默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都向这一个region写数 ...