const 常量_条款03:尽可能使用const

9c6030a649b3fdfe8deb8f57e8fc12f6.png
const 允许你指定一个语义约束(也就是指定一个“不该被改动”的对象),而编译器会强制实施这项约束。

1、const指针

如果关键字const出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针两者都是常量

关键字const出现在类型前后类型后星号前,意义都是相同的,表示被指物是常量。
例:int const * a 等价于 const int *a

STL中的迭代器以指针为根据塑造出来的,所以迭代器的作用就相当于T*指针。声明迭代器为const就像声明指针为const一样(即声明一个T* const 指针),表示这个迭代器不能指向别的不同的东西,但他所指的值是可以改变的。如果你希望迭代器所指的东西不可被改动(即希望STL模拟一个const T*指针),这时候就需要的是const_iterator。两种格式:

const std::vector<int>::iterator

std::vector<int>::const_iterator

2、const 成员函数

将const 实施于成员函数的目的,是为了确认该成员函数可作用于const对象身上。
1、const成员函数的接口比较容易被理解,可以得知哪个函数可以改动对象,哪个函数不可以改动对象
2、是操纵 const 对象成为可能

两个成员函数如果只是常量性(constness)不同,可以被重载。

3、两个阵营:bitwise constness 和 logical constness

bitwise const阵营相信:成员函数只要在不更改对象的任何成员变量(static 除外)是才可以说是const。也就是说它不更改对象内的任何一个bit。

const成员虽然保证了成员变量值不会被改变,但是如果这个变量是指针或者引用,那么可以通过这个指针或引用去改变被指物。随便改变了值,但依然可以通过编译器编译。这里面虽然是满足了bitwise const

logical constness 阵营不主张:一个const成员函数可以修改它所处理的对象内的某些bits,但只有在客户端侦测不出的情况才可如此(没理解啥意思)

const成员函数中想要修改成员变量的话,在声明变量的时候在前面加上mutable即可。

4、在const 和 non-const 成员函数中避免重复

假若const 重载 non-const函数,但是其中的操作都是一样的,那么就会造成代码重复。可以让non-cosnt 函数去调用const函数。不过在调用过程中需要经过两次转型,1、将non-const的this指针转换为const指针2、将返回值得const去掉


请记住:

  • 将某些东西声明为 const 可帮助编译器侦测出错误用法。 const 可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。
  • 编译器强制实施bitwise constness,但你编写程序时应该使用“概念上的常量性”(conceptual constness)
  • 当const 和 non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复

本文主要内容来自于侯捷老师译的《Effective C++》,大力推荐感兴趣的同学可以去购买。也欢迎大家交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript高级程序设计---js事件思维导图

绘制思维软件与平时用的笔记&#xff0c;以及导出功能&#xff0c;这三个问题综合起来&#xff0c;于是我把思维导图分开画 1、js事件的基本概念 2、js事件的事件处理程序 3、js事件的事件对象 转载于:https://www.cnblogs.com/Jamie1032797633/p/10567419.html

jq挑战30天——打字机效果+小程序

<!doctype html><html><head><meta charset"utf-8"><title>基于jQuery实现的打字机效果-jq22.com</title><script src"http://libs.baidu.com/jquery/1.11.3/jquery.min.js"></script><style></…

和 Thrift 的一场美丽邂逅

一. 与 Thrift 的初识 也许大多数人接触 Thrift 是从序列化开始的。每次搜索 “java序列化” “方式”、“对比” 或 “性能” 等关键字时&#xff0c;搜索引擎总是会返回一大堆有关各种序列化方式的使用方法或者性能对比的结果给你&#xff0c;而其中必定少不了 Thrift&#…

instagram技术_Instagram9位科技女孩进行技术采访的主要技巧

instagram技术by Rachel通过瑞秋 Instagram9位科技女孩进行技术采访的主要技巧 (Top tips for technical interviews from nine of Instagram’s tech girls) My job-hunt came to an end a few weeks ago. After endless phone interviews, coding challenges, and on-sites,…

弹出框 每次打开 滚动条置顶_微信置顶文字怎么弄?微信置顶一句话教程

今日支付宝红包支付宝首页搜索511501453马上领取红包(支付宝双十二活动&#xff0c;瓜分15亿红包)(领取后一定要记得使用&#xff0c;不然会浪费的呦&#xff0c;更会影响第二天的领取&#xff01;)奶思靓机“ 一 个 有 用 的 公 众 号 の ”嗨&#xff0c;最近很流行在微信上面…

Python学习_字符串格式化

#!/usr/bin/env python # -*- coding:utf-8 -*-# 百分号格式化 # %[(name)[flags][width].[precision]]typecode # name : 指定占位符的key # flags : - 空格 0 # width : 宽度 # precision : 小数点后保留的位数 # typecode : 必需,数据类型 # 字符串里面有%的时候, %%表示一…

python 3 面向过程编程

python 3 面向过程编程 核心是过程&#xff08;流水线式思维&#xff09;&#xff0c;过程即解决问题的步骤&#xff0c;面向过程的设计就像设计好一条工业流水线&#xff0c;是一种机械式的思维方式。 1、优点&#xff1a;程序结构清晰&#xff0c;可以把复杂的问题简单化&…

在ionic/cordova中使用百度地图插件

在ionic项目中&#xff0c;如果想实现定位功能&#xff0c;可以使用ng-cordova提供的cordova-plugin-geolocation。 但由于高墙的缘故&#xff0c;国内andorid环境下&#xff0c;此插件不起作用&#xff08;ios环境下可用&#xff09;。 国内比较好的是现实使用百度地图提供的A…

django国际化与html语言,Django 国际化

Django 国际化Django 支持国际化&#xff0c;多语言。Django的国际化是默认开启的&#xff0c;如果您不需要国际化支持&#xff0c;那么您可以在您的设置文件中设置 USE_I18N False&#xff0c;那么Django会进行一些优化&#xff0c;不加载国际化支持机制。NOTE: 18表示Intern…

mongo 删除节点_将生产节点/ Express Mongo App部署到AWS —反思

mongo 删除节点在AWS中部署生产Web应用程序的经验教训 (Lessons learned deploying a production web application in AWS) 背景 (Background) This is not a code-based tutorial. It consists of all the things I wish I knew before I started the project and the steps I…

汉诺塔问题递归算法python代码_[python]汉诺塔问题递归实现

一、问题描述及算法步骤 汉诺塔问题的大意是有三根柱子a, b, c&#xff0c;现在a柱有N个盘子从下往上尺寸递减排列&#xff0c;要求&#xff1a; 1. 将a上的盘子移动到c柱上; 2. 每次移动一个盘子; 3. 柱子上的盘子始终必须是大的在下面image.png 汉诺塔问题的经典实现算法步骤…

【硬件】PCB设计步骤

前言 合理的PCB设计步骤&#xff0c;可以减少反复修改的可能性。动手设计PCB前&#xff0c;需要按步就班准备一些资料&#xff0c;即使是小项目。 本文将讲解如何一次性成功地设计一款PCB的常规步骤。 当然&#xff0c;如果是一个系统&#xff0c;则需要按照瀑布式的思路&#…

linux install StarDict

1.  sudo apt-get install stardict 2.  Downloads from: http://abloz.com/huzheng/stardict-dic/zh_CN/ 3.  tar jxf stardict-21shijishuangxiangcidian-2.4.2.tar.bz2 -C /usr/share/stardict/dic (etc other dictionaries)转载于:https://www.cnblogs.com/HurryXin/…

交付方式 saas_我在全职工作时如何交付我的第一个SaaS副项目

交付方式 saasby Tigran Hakobyan由Tigran Hakobyan 我在全职工作时如何交付我的第一个SaaS副项目 (How I shipped my first SaaS side-project while working full-time) This is my personal story of how I shipped my very first SaaS side-project while working full-ti…

nginx搭建基于http协议的视频点播服务器

1&#xff0c;于由自己的服务器上已经安装好nginx(具体安装方法见我的另一篇文章&#xff0c;Linux中安装nginx)&#xff0c;所以不再安装。 2&#xff0c;下载nginx_mod_h264_streaming-2.2.7.tar.gz(自己在网上搜吧)。 3&#xff0c;安装pcre&#xff0c;先看有没有安装。 [r…

plsql 批量调存储过程_数控双端开榫机:批量铣榫头真牛气

数控双端开榫机主要用于实木家具批量化铣榫头专用&#xff0c;因为其本身的优势逐渐被家具厂老板们所接受&#xff0c;是目前家具生产不可缺少的一款自动化设备&#xff0c;给企业节约了生产成本&#xff0c;今天又焦峰小编来给大家讲解一下。主要技术参数&#xff1a;知乎视频…

c 向html页面传值,html页面之间的传值,获取元素和方法的调用

这篇文章是自己在项目中遇到&#xff0c;同时参考了网上的资料&#xff0c;作为笔记参考使用一、页面之间的传值1、使用cookie传值封装简单使用&#xff1a;//获取cookiefunction getCookie(name){var arr,regnew RegExp("(^| )"name"([^;]*)(;|$)");if(ar…

Codeforces Round #364 (Div. 1) (差一个后缀自动机)

B. Connecting Universities 大意: 给定树, 给定2*k个点, 求将2*k个点两两匹配, 每个匹配的贡献为两点的距离, 求贡献最大值 单独考虑每条边$(u,v)$的贡献即可, 最大贡献显然是左右两侧点的最小值. #include <iostream> #include <algorithm> #include <cstdio&…

Python黑魔法

1. 赋值 In [1]: x 1...: y 21...: print x, y...: ...: x, y y, x...: print x, y 1 21 21 1 2. 列表合并 In [2]: a1 [(2,3),(3,4)]...: a2 [(4,5)]...: a a1 a2...: print a [(2, 3), (3, 4), (4, 5)] 3. 字典合并 方式1: In [3]: d1 {a: 1}...: d2 {b: 2}...: ...…

python时间差怎么转换为数字_pandas进行时间数据的转换和计算时间差并提取年月日...

#pd.to_datetime函数 #读取数据 import pandas as pd data pd.read_csv(police.csv) #将stop_date转化为datetime的格式的dataframe&#xff0c;存到stop_datetime data[stop_datetime] pd.to_datetime(data.stop_date) #自定义一个时间&#xff0c;计算时间差 data_new pd.…