[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树的基本原理:利用字串的公共前缀来节省存储空间,最大限度的减少无谓 ...
随机推荐
- java并发编程(8)原子变量和非阻塞的同步机制
原子变量和非阻塞的同步机制 一.锁的劣势 1.在多线程下:锁的挂起和恢复等过程存在着很大的开销(及时现代的jvm会判断何时使用挂起,何时自旋等待) 2.volatile:轻量级别的同步机制,但是不能用 ...
- 转【js & jquery】遮罩层实现禁止a、span、button等元素的鼠标事件
/*遮罩层代码 作用:通过遮罩层的方式防止表单提交次数过多 */ function MaskIt(obj){ var hoverdiv = '<div class="divMask&q ...
- 撩课-Java每天10道面试题第2天
11.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面, 以便更充分地注意与当前目标有关的方面. 抽象并不打算了解全部问题,而只是选择其中的一部分, 暂时不用部分细 ...
- python模块之numpy与pandas
一.numpy numpy是python数据分析和机器学习的基础模块之一.它有两个作用:1.区别于list列表,提供了数组操作.数组运算.以及统计分布和简单的数学模型:2.计算速度快[甚至要由于pyt ...
- 【SSH网上商城项目实战03】使用EasyUI搭建后台页面框架
转自:https://blog.csdn.net/eson_15/article/details/51312490 前面两节,我们整合了SSH并且抽取了service和action部分的接口,可以说基 ...
- [LeetCode]Remove Duplicates from Sorted Array题解
Remove Duplicates from Sorted Array: Given a sorted array, remove the duplicates in place such that ...
- JMX 远程监控 Linux tomcat 功能实现
作者远程服务器操作系统 CentOS 7.0, tomcat 版本 7.0 1. Linux tomcat 配置 1.1 catalina_opt 配置 可以在 catalina.sh 文件中添加如下 ...
- 基于.Net下整合FastReport,实现条码标签批量打印
一. 准备工作 1. 点击此下载支持.Net4.0的 FastReport ,安装后并破解 2. VS2012 工具箱中,新建选项卡,添加 %安装目录%\Framework 4.0\FastRepor ...
- 几个css3动画库
Hover.css 查看演示: http://ianlunn.github.io/Hover/ github地址: https://github.com/IanLunn/Hover Animate.c ...
- SqlServer代理(已禁用代理xp)
SqlServer 本地库作业管理的时候已禁用,将其修改为可使用,master数据库下执行以下语句: sp_configure 'show advanced options', 1; GO REC ...