Effective C++ 读书笔记 条款03:尽可能使用const

《Effective C++》 读书笔记(详细总结55条款)上篇 下面从四个方面来说 (1) C++ 以 C 为基础,很多语句语法都没有改变,只是进行了扩展,C++ 解决问题的时候,可以理解为 C 的高效解法 (2) 面向对象,有构造函数,析构函数,继承、封装、多态、虚函数动态绑定,这是不同于C 语言的部分 (3) 泛型编程、可以理解为代码的模型,但是代码本身并不占用内存空间,只有在实例化的时候,才分配内存,所以可以提高代码复用性 阅读详情

Core List

1.  const 修饰指针变量

char *name = "Boxi"; //非常量指针,非常量变量

const char* name = "Boxi"; //非常量指针,常量变量

char const* name = "Boxi"; //非常量指针,常量变量(同上1等价)

char* const name = "Boxi"; //常量指针,非常量变量

const char* const name = "Boxi"; //常量指针,常量变量


2. const 修饰迭代器

(1) const vector<int>::iterator it = vec.begin();  //常量指针,非常量变量【T* const】

     *iter = 10; //【正确】可以修改指针指向地址内的数据

      iter++;     //【错误】不可修改指针指向的地址

(2) vector<int>::const_iterator it = vec.begin(); //非常量指针,常量变量【const T*】

     *iter = 10; //【错误】不可以修改指针指向地址内的数据

      iter++;     //【正确】可修改指针指向的地址


3. const 修饰函数

(1) 修饰返回值

const Fun (const int &a, const int& b); // 避免返回值被重新误赋值

(2) 修饰参数

const Fun (const int &a, const int& b); // 避免函数内部修改变量

(3) 修饰成员函数【目的:操作 const 对象】

class Man {

pubilic:

    const char& operate[] (unsigned int index) const

    { return text[index]; } // const 对象调用此函数

    char& operate[] (unsigned int index)

    { return text[index]; } // 非 const 对象调用此函数

private:

    std::string text;

}

例:

const Man cm("Boxi"); //cm为const类型

cout<<cm[0]<<; //【正确】读一个const类型对象

cm[0] = 'x; //【错误】写一个const类型对象


Man m("Boxi"); //m为非const类型

cout<<m[0]<<; //【正确】读一个非const类型对象

m[0] = 'x'; //【正确】写一个const类型对象

注:如果返回的是char 而非 &char,则m[0]='x'不合法,其赋值的是m.text[0]的一个副本【函数返回值是内置对象,则函数返回值不可被修改】


4. bitwise constness 和 logical constness

bitwise constness :不更改对象内的任何一个bit

logical constness :可以修改它锁处理的对象内某些 bit, 但只有在客户端侦测不出的情况。

注:bitwise constness 问题 【满足bitwise constness测试,但值被修改】

对象包含的成员是指针,指针所指向的地址中的变量改变了。

注:取消 bitwise constness 约束 【使用 mutable 修改变量】


5. const 和 non-const 成员函数中避免代码重复

(1) const 内部调用 non-const 【错误】(non-const 可修改对象内部变量,其不能包含在const内部)

(2) non-const 内部调用 const 【正确】(两次类型转换)

const char& operate[] (unsigned int index) {}

char& operate[] (unsigned int index) {

    return const_cast<char&>(static_cast<const TextBlock&>(*this) [index])

}

注:

static_cast :将non-const 转化为 const

const_cast :将返回值移除const






Effective Modern C++ 条款16:让const成员函数线程安全 在这个类中,使用一个函数来计算多项式的根是很有用的,也就是多项式的值为零的时候(译者注:通常也被叫做零点,即使得多项式值为零的那些取值)。计算多项式的根是很复杂的,因此如果不需要的话,我们就不做。在没有同步的情况下,让多个线程执行读操作是安全的。声明在C++11中与在C++98中一样正确(检索多项式的根并不会更改多项式的值),因此需要纠正的是线程安全的缺乏。这就意味着在没有同步的情况下,这些代码会有不同的线程读写相同的内存,这就是数据竞争(的经典使用样例,这也是为什么它是数据成员声明的一部分。 阅读详情

相关推荐

OFDM信道估计进阶:EM迭代算法原理与Python实现

信道估计是无线通信接收机的核心环节,LS估计简单但噪声放大严重,MMSE依赖先验统计量难以获取。期望最大化(EM)算法通过迭代交替估计信道与噪声参数,无需显式信道相关矩阵,在低信噪比下显著提升估计精度。该技术适用于OFDM基带仿真、接收机算法验证等场景,可在不增加导频开销的前提下改善误码率性能。本文围绕ofdm_EM_channel实现,给出完整的数学推导与Python代码,并分享导频间隔配置、迭代次数选择及工程避坑经验。

weixin_34379433的博客 425

Effective C++读书笔记 条款03:尽可能使用const

条款03:尽可能使用const 这个条款的内容叙述了很多,不便全部列出。但主要还是围绕在对const的优点的阐述上,和如何正确与合理使用const。     const的一件奇妙的事情是,它允许你指定一个语义约束,而编译器会强制实施这项约束。它允许你告诉编译器和其他程序员某个数值应该保持不变。只要这(某值保持不变)是事实,你就确实该说出来,因为说出来可以获得编译器的相助,确保这条约束不被违反。

qq973177663的专栏 564

单端反激电源的RCD钳位电路吸收设计

反激电源尖峰电压和特点: 反激开关电源主要适用于中小功率<100W的电源设计中,特点是电路简单、成本低、可靠性高、宽稳压范围、转换效率PF高。但是由于本身变压器的漏感和其他参数的影响,变压器在高速开关关断瞬间会产生很大的尖峰电压,截止时产生的尖峰电压是由电路中的储能元件释放的电流引起的突变,过高的尖峰电压会影响开关管的正常工作,需要对尖峰电压采取措施抑制尖峰电压。 如上图所示,尖峰电压的钳位抑制方式有很多种。 TVS成本偏高,属于硬件导通,元件的可靠性较差,在低电压工作效果不理想。 RCD回路吸收

qq_31687191的博客 8489

读书笔记《Effective C++》条款03:尽可能使用const

const允许你指定一个语义约束(也就是指定一个“不该被改动”的对象),而编译器会强制实施这项约束。它允许你告诉编译器和其他程序员某值应该保持不变。 可以用const在class外部修饰global或namespace作用域中的常量,或修饰文件、函数、或区块作用域(block scope)中被声明为static的对象。也可以用它修饰class内部的static和non-static成员变量。

Do-Program的专栏 344

Playwright Java环境配置避坑指南:浏览器路径、类加载与离线部署

Playwright作为现代端到端测试框架,其Java SDK突破了传统Selenium的Driver管理模式,将Chromium/Firefox/WebKit内核视为可编程运行时资源。其核心原理在于SDK与浏览器二进制分离——Maven仅管理Java字节码,而浏览器需独立下载、校验与沙箱加载。这一设计带来显著技术价值:跨平台一致性、进程隔离安全性及多浏览器并行能力;典型应用场景涵盖Spring Boot集成测试、金融级离线CI/CD、Kubernetes容器化部署及Air-Gapped封闭环境。然而,因J

weixin_32956805的博客 677

量化回测系统实战指南:从VectorBT到自研框架的深度解析

本文深入解析量化回测系统实战,从VectorBT和Backtesting.py的对比到自研框架miniQuant的设计与优化。探讨如何平衡速度与灵活性,解决实盘适配性问题,并提供性能调优技巧和可视化分析工具,帮助开发者构建高效可靠的量化交易系统。

weixin_28308325的博客 277

《Effective C++》读书笔记 条款03 尽可能使用const

如果你对const足够了解,只需记住以下结论即可:将某些东西声明为const可帮助编译器侦测出错误用法,const可被施加于任何作用于内的对象、函数参数、函数返回类型、成员函数本体。编译器强制实施bitwise constness,但你编写程序时应该使用概念上的常量性当const和non-const成员函数有实质等价的实现是,令non-const版本调用const版本可避免代码重复关键字const...

Galaxy_saltyfish的博客 397

别急着编译!修复银河麒麟OpenSSH漏洞前,先搞懂ssh、sshd版本与apt仓库的“爱恨情仇”

本文深度解析银河麒麟OpenSSH漏洞(CVE-2023-38408)修复策略,揭示版本差异背后的企业级维护逻辑,提供从APT升级到源码编译的多维度方案评估。特别针对路径隔离方案和离线环境处理给出技术细节,帮助企业制定兼顾安全与稳定的升级决策框架。

weixin_26642481的博客 454

【Effective C++ 读书笔记】条款03: 尽量使用 const

关键字const多才多艺,变化多端却不高深莫测。const 修饰指针 面对指针, 你可以指出 指针自身、指针所指物、或者两者都不是 const。如果关键字 const 出现在星号左边,表示被指物是常量。 (const 出现在类型之后,星号之前 ,同上边两者意义相同) 如果出现在星号 右边,表示指针自身是常量。 如果出现在星号两边,表示被指物和指针两者都是常量。char greeting[ =

赚钱去看球 498

三维重建Fusion中的TSDF算法通俗描述

看个视频 https://www.youtube.com/watch?v=8M_-lSYqACo 这是mobilefusion的视频,大家先了解一下,看到在三维重建的时候外面有个长方体包围盒了吗? 数据准备: 我们不同角度拍摄的RGB图、深度图和相应的pose.txt。 步骤: 1.建立长方体包围盒 要建立一个长方体包围盒。让所有的三维点都在这个长方体里面。 假设z方向垂直相机。 很明显,x,y方...

qq_30339595的博客 1万+

从基础知识到PCB设计,打造全能硬件工程师

成为一名出色的硬件工程师需要在多个领域建立坚实的基础。从硬件基础知识、元器件学习、模拟电子电路到PCB设计,以及数字电子电路与通信,每个方面都是构建全面硬件工程师技能集的重要组成部分。通过深入学习和实践这些领域,你将能够在硬件工程领域中取得更多的成就。

weixin_46969363的博客 2722

条款03:尽可能使用 const 【读书笔记 Effective C++】

基础知识: (1)编译器会保证const修饰不可改变的约束 //tip 1: char greeting[] = "Hello"; const char* p = greeting; greeting[1] = 'x'; // wrong p[1] = 'x'; // correct //tip 2: const char*p //表示被指物是常量 ...

fm2011的专栏 255

Unet++改进33:添加ConvolutionalGLU(2024最新改进方法)|紧凑的网络结构和高效的运算

由于残差连接的深度退化效应,许多依赖堆叠层进行信息交换的高效视觉变形模型往往不能形成足够的信息混合,导致视觉感知不自然。为了解决这个问题,在本文中,我们提出了聚合注意力,这是一种基于仿生设计的令牌混合器,它模拟生物中央凹视觉和连续眼运动,同时使特征映射上的每个令牌具有全局感知。此外,我们结合了可学习的令牌,与传统的查询和键交互,这进一步多样化了亲和矩阵的生成,而不仅仅依赖于查询和键之间的相似性。我们的方法不依赖于堆叠进行信息交换,从而有效地避免了深度退化,实现了自然的视觉感知。

AIcurator的博客 683

Effective C++读书笔记(3) 条款03 尽可能使用const

​ 解决方法可以是使用一个标记位判断是否有效, 但是这种有效也是会在 const 接口函数中改变的, 所以并不可以被坚持要 bitwise constness 的编译器同意. 这时可以利用 C++ 的一个和 const 相关的摆动场 mutable, mutable 会告诉编译器这个成员是 const 但是, 他还是有可能会被改动, 所以编译器会进行放行.​ const最具威力的用法是和函数声明结合, 在一个函数声明中可以和函数返回值, 各参数值, 函数自身(如果是成员函数的话)产生关联.

roseisbule的博客 284

一、适配显示服务

基于rk3568适配显示服务,调动gpu;

XiaoC_Android的博客 1001

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Effective C++读书笔记(条款03:尽可能使用const)

如果关键字const出现在*号的左边,被指物是常量。 如果关键字const出现在*号右边,表示指针自身是常量。 如果关键字const出现在*号两边,被指物和指针都是常量。 char greeting[]="Hello"; const char* p=greeting; //non-const pointer, const data(常量指针) char* const p=greeting; //const pointer, non-const data(指针常量) con

zhongh58的博客 764

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

读书笔记《Effective c++》 条款03 尽可能使用const

const是一种约束,告诉编译器和其他程序员,这个值不要被修改。 a.函数返回值是常量: 例如有理数的乘法重载: const Rational operator* (const Rational& lhs, const Rational& rhs);这样写可以避免一些暴行,例如 Rational a, b, c; (a * b) = c; b.const成员函数 将const实

木头刀 280

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

effective C++读书笔记--【条款03:尽可能使用const】

这一节的意思其实总结下来就是一个目的:“对象不该被改变”的语义约束尽量交给编译器来做,方法就是使用const,说人话就是如果程序员希望一个对象的值是不能被改变的,请积极大胆的给这个对象加上const。 然后为什么要尽量使用const呢,作者大体从4个角度来说明这个const的使用场景: const指针和指向const对象的指针; STL迭代器与const结合后的效果; 函数的返回值或参数搞...

liangll的博客 277

《Effective C++读书笔记》--条款03:尽可能使用const

--1、const修饰指针和对象的不同方法: 对于const时代表指针指向的地址是const还是该指针指向的地址内的对象是const,只需牢记一点:如果关键字const出现在*左边,表示被指物是常量,如果出现在*右边,表示指针本身是常量。 在STL中来说,声明迭代器为const就如同声明指针为const一样(const在*左边),表示迭代器不得指向不同的东西,但它所指向的东西的值可以改变。如果

WingC的博客 398

《Effective C++》读书笔记 条款03 尽可能使用const 使代码更加健壮

如果你对const足够了解,只需记住以下结论即可:将某些东西声明为const可帮助编译器侦测出错误用法,const可被施加于任何作用于内的对象、函数参数、函数返回类型、成员函数本体。编译器强制实施bitwise constness,但你编写程序时应该使用概念上的常量性(logical constness)当const和non-const成员函数有实质等价的实现时,令non-const版本...

weixin_30414155的博客 100

[Effective C++读书笔记]003_条款03_尽可能使用const

参考同事博客:http://www.cnblogs.com/hustcser/archive/2012/10/19/2731085.html 转载于:https://www.cnblogs.com/alephsoul-alephsoul/archive/2012/10/17/2727057.html

weixin_33671935的博客 73

Effective C++ | 读书笔记 (一)

这意味着,如果你在一个编译单元中依赖于另一个编译单元中的全局静态对象的初始化结果,你的程序可能会遇到未定义行为,因为那些对象的初始化次序是不确定的。在构造、析构函数中一定只会调用本类中的虚函数。原因:当基类指针(引用)指向子类对象时,如果析构对象通过delete 指针的方式,只会调用基类的析构函数,不会调用子类的析构函数。如果把这个当做是基类,会有问题,析构函数只有声明没有定义,析构函数从派生类到基类的调用时,会发生链接错误。时,先调用基类的构造函数,此时派生类还没有被构造出来,所以调用的是基类的虚函数。

m0_74795952的博客 1042

【读书笔记】Effective C++ 条款3:尽可能使用const

同时,对于缓存,我们可能需要微小改动里面的值,即使改变了也依旧认为是const。的重载,const函数和非const函数绝大多数代码都是一样的,因此能否复用呢?在上面的代码中,const仅仅为保证str1指向的字符不被改变,但是我们可以将str1指向的内容改变。(注意:由于书本是比较老的,现在即便是c++98编译也会报错,但是由于是书中的例子,就讲究看一下吧)在这过程中,将const作为让编译器维护常量的口令,将编译器当作你的朋友。理论可以,但是调用非const就意味着需要冒着被改变的风险。

m0_68617924的博客 1003

读书笔记_Effective C++_习惯C++

这是一本非常经典C++书籍,也是我在工作中发现自己C++上还有很多薄弱点的时候经常拿来充电的。这本书内容很多,讲了很多如何高效地使用C++的方法,有些地方自己也没能啃透,读过一遍后很多知识点容易忘记,这次是一条一条地进行温习,之所以会分享出来是觉得对于程序员来说,好记性不如烂笔头,自己多动手往往在真正写程序的时候能够像条件反射一样写出好的代码。慢工出细活,对待技术要有谨慎和敬畏之心。这本书推荐喜欢C

John_cdy的专栏 3194

《Effective C++》读书笔记

effective C++读书笔记,持续更新中......

weixin_45654421的博客 261
上一篇: Effective C++ 读书笔记——条款02:尽量以const,enum,inline替换#define
下一篇: Effective C++ 读书笔记——条款04:确定对象被使用前已先被初始化
B_Dogs881221
博客等级 码龄15年 15粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值