[Effective C++]条款03:尽可能使用const

《Effective C++》条款02、条款03、条款20、条款21阅读笔记:关于static、const、constexpr的思考 —— 2024-01-15 原文: 旧式编译器也许不支持上述语法,它们不允许static成员在其声明式上获得初值。此外所谓的"in-class初值设定"也只允许对整数常量进行。如果你的编译器不支持上述语法,你可以将初值放在定义式。唯一例外是当你在class编译期间需要一个class常量值,例如在上述的GamePlayer::scores的数组声明式中(是的,编译器坚持必须在编译期间知道数组的大小)。这时候万一你的编译器(错误地)不允许"static整数型class常量"完成"in class初值设定" 阅读详情

1、const关键字
const关键字常用于定义常量,表示某个值、对象或指针在程序运行期间不可修改,也用于修饰函数,引用等.
2、常量
用于定义不可修改的变量,必须在定义时初始化。

const int x = 10;
// x = 20; // 错误:x是常量,不可修改

3、常量指针与指针常量
3.1)、常量指针(Pointer to Constant):指针指向的值不可修改,但指针本身可以指向其他地址。

  • const在星号左边
const int* ptr = &x;
// *ptr = 20; // 错误:ptr指向的值不可修改
int y = 30;
ptr = &y; // 正确:ptr可以指向其他地址

3.2)、指针常量(Constant Pointer):指针本身不可修改,但可以通过指针修改指向的值。

int* const ptr = &x;
*ptr = 20; // 正确:可以通过ptr修改x的值
// ptr = &y; // 错误:ptr是常量,不可指向其他地址

3.3)、常量指针常量(Constant Pointer to Constant):指针本身和指针指向的值都不可修改。

const int* const ptr = &x;
// *ptr = 20; // 错误:ptr指向的值不可修改
// ptr = &y; // 错误:ptr是常量,不可指向其他地址

4、常量引用
用于定义不可修改的引用。常用于函数参数,避免拷贝大对象。

int x = 10;
const int& ref = x;
// ref = 20; // 错误:ref是常量引用,不可修改

void test(const std::string &txt){...}

5、const与函数
5.1)、const修饰函数参数
表示函数内部不会修改该参数的值。

void func(const int x) {
    // x = 20; // 错误:x是常量,不可修改
}

5.2)、const修饰函数返回值
const可以修饰函数的返回值,表示返回值是常量,不可修改。

const int getValue() {
    return 10;
}

int main() {
    const int x = getValue();
    x = 20; // 错误:x是常量,不可修改
}

5.3)、const成员函数
const成员函数表示该函数不会修改类的成员变量。const成员函数只能调用其他const成员函数。

class MyClass {
public:
    int value;
    void setValue(int v) { value = v; }
    int getValue() const { return value; } // const成员函数
};

int main() {
    const MyClass obj;
    obj.setValue(10); // 错误:obj是常量对象,不能调用非const成员函数
    int x = obj.getValue(); // 正确:可以调用const成员函数
}

5.4)、const函数重载
const可以用于区分函数重载。

class MyClass {
public:
    void func() { // 非const成员函数
        std::cout << "Non-const func\n";
    }

    void func() const { // const成员函数
        std::cout << "Const func\n";
    }
};
常量对象只能调用const成员函数。
const MyClass obj1;
obj1.func(); // 调用const版本,输出:"Const func"

非常量对象优先调用非const成员函数。
MyClass obj2;
obj2.func(); // 调用非const版本,输出:"Non-const func"

6、const与类
6.1)、常量成员变量

  • 必须在构造函数初始化列表中初始化。
class MyClass {
public:
    const int value;
    MyClass(int v) : value(v) {}
};

6.2)、static静态常量成员

  • 使用static const定义类的静态常量成员。
class MyClass {
public:
    static const int value = 10;
};

6.3)、mutable

  • 即使对象是const,mutable成员变量仍然可以被修改。
class MyClass {
public:
    mutable int cache;
    int getValue() const {
        cache++; // 正确:cache是mutable
        return cache;
    }
};

7、const与智能指针

  • const可以修饰智能指针本身或指向的值。
const std::unique_ptr<int> ptr1 = std::make_unique<int>(10);
// ptr1 = nullptr; // 错误:ptr1是常量
// *ptr1 = 20;     // 正确:ptr1指向的值可以修改

std::unique_ptr<const int> ptr2 = std::make_unique<const int>(10);
// *ptr2 = 20;     // 错误:ptr2指向的值是常量

8、const与容器
const可以修饰容器本身或容器中的元素。容器内的元素值不可修改

const std::vector<int> vec = {1, 2, 3};
// vec[0] = 10; // 错误:vec是常量,元素不可修改

9、const与constexpr

  • constexpr用于定义编译期常量。
constexpr int x = 10; // 编译期常量
const int y = 20;     // 运行时常量

10、为什么要尽量多使用const

  • 提高代码的可读性和安全性。
  • 防止意外修改数据。
  • 支持常量对象和常量表达式。
  • 优化性能(如避免拷贝大对象)。

思维导图笔记:

在这里插入图片描述

干扰管理学习日志4-------信道估计方法 LS(最小二乘)、MMSE(最小均方误差) 信道估计,就是从接收数据中将假定的某个信道模型的模型参数估计出来的过程。如果信道是线性的话,那么信道估计就是对系统冲激响应进行估计。需强调的是信道估计是信道对输入信号影响的一种数学表示,而“好”的信道估计则是使得某种估计误差最小化的估计算法。本文主要讲述非盲信道估计中的LS估计和MMSE估计。LS全称为,即估计的信道参数与实际信道参数的差,进行平方求和后得到的误差累积最小。MMSE估计是LS估计的改进,在LS估计的最终结果的基础上乘以加权矩阵,使之与实际信道参数更为接近。 阅读详情

相关推荐

PCB设计必看:铜皮厚度与载流量的黄金比例(附实用对照表)

本文深入探讨了PCB设计中铜皮厚度与载流量的关键关系,提供了实用的对照表和设计技巧。通过分析基础原理、标准选择策略及常见误区,帮助工程师优化PCB设计,确保电路板的可靠性和安全性。特别适用于需要处理大电流或高频应用的电子设计场景。

milk8的博客 511

指针重点总结-常量指针-const ptr *,指针常量ptr * const,引用,指针传参,指针修改,指针指向的值修改等问题

C/C++指针踩坑历险记-常量指针-const ptr *,指针常量ptr * const,引用,指针传参,指针修改,指针指向的值修改等问题 好久没写C语言了,不过一直用C++在刷题,遇到指针总有些发憷?初学指针的时候觉得指针好难,其实搞清指针的重要几个概念,指针就不难~对指针一些重点知识进行一个总结。 指针初体验 我们知道指针本质上就是一个存放地址的变量(该变量存放地址,一串你看不懂的数字)。比如 int a = 3; int* ptr = &a;//就表示指向a的一个变量ptr,ptr内部存放的

qq_44850917的博客 2279

Intel Arc显卡玩《三角洲行动》报错?手把手教你修改注册表跳过验证

本文针对Intel Arc显卡用户在运行《三角洲行动》时遇到的驱动验证报错问题,提供了详细的解决方案。通过安全修改Windows注册表,添加特定键值以跳过游戏驱动兼容性验证,并结合游戏内图形设置与Intel驱动面板的优化建议,旨在帮助玩家顺利进入游戏并提升游戏帧率与运行稳定性。

weixin_29310605的博客 695

C++新特性02_ nullptr与constexptr(NULL本质是0;nullptr空指针,本质还是0,但具有了指针类型;constexpr(常量表达式);局部变量空间在编译器就决定)

本篇主要讲C++的新特性nullptr与constexptr。 1.nullptr (1)NULL带来的问题 在之前我们定义指针的初始化时,使用的是NULL,但是由于其为预定义的,本质上还是0,因此会造成重载出错的问题。下面就是重载出错的一个案例: 使用NULL进行指针初始化 重载至错误函数 (2)NULL的本质 预编译时已经定义为0,其实就是0。 (3)nullptr的使用: 本质还是0,但是具有指针类型。 等价于: foo((char*)NULL); 由于重载时有两个函数都满足条件,存在二义

分享学习成长历程,Winter is coming! 1690

[Unity Demo]从零开始制作空洞骑士Hollow Knight第四集:制作更多的敌人

大家好久不见,终于放完中秋假期可以回自己家里打代码了,上一期我介绍了为什么和如何导入2D toolkit以及制作一个完整的敌人(就是那只蚊子包括了精灵,动画,状态机行为以及脚本)现在不妨趁热打铁制作更多的敌人。

dangoxiba的博客 1974

黑猫带你学eMMC协议第26篇:eMMC的硬件复位操作(H/W reset)

本文依据eMMC JEDEC5.1及个人工作经验整理而成,如有错误请留言。 文章为个人辛苦整理,付费内容,禁止私自转载。 文章所在专栏:《黑猫带你学:eMMC协议详解》 1 概述 什么是硬件复位? 硬件复位就是使用一个特殊硬件信号(这个信号在RST_n这根实实在在的物理线路上传输)将emmc复位到pre-idle state,而不需要使用cmd0或者power cycle讲emmc复位到pre-idle state。 如何进行硬件复位? 1、设置RST_n_FUNCTION [162]为1,使emm.

黑猫奥利奥的博客 6316

【C++11】constexptr

引言 先明确const关键字,常量的引用,常量传参 const修饰的常量属于右值 区分左值和右值   C/C++中的变量有左值和右值之分,他们的区别主要如下: (1)左值可以放在赋值号 = 的左右两边,右值只能放在赋值号 = 的右边 (2)在C语言中,有名字的变量即为左值;而函数的运行结果或表达式中间变量即为右值 (3)对于内嵌类型(基本类型,即built-in types),右值是不可以被更改的,也不可以被const,volatile所修饰;   对于自定义类型,右值却可以通过它的成员函数来进行修改

九筒的博客 4310

【电路设计】SERDES与pcie

明确通信接口需要达到什么样的数据速率、信号完整性以及系统中各个部件的互相作用。2.

数字人生 4566

C++之const关键字用法详解

1、const的含义:固定不变的意思,即不可改变。 2、const 修饰的表现形式 1)修饰变量 例如: const int value=1; const 意义:变量value的值一经定义不可再进行修改。 2)修饰指针 例如: const int*ptr; const 意义:指针ptr所指内容的值不可修改,即*ptr不可以再进行赋值。 int* const ptr; const 意义:指针ptr所...

weixin_43965705的博客 720

使用 MATLAB/Simulink 搭建一个步进电机细分控制系统的仿真模型

步进电机(Stepper Motor)是一种将电脉冲信号转换为角位移或线位移的执行元件,广泛应用于数控机床、3D打印、机器人、精密仪器等领域。其特点是开环控制、定位精度高、响应快、无累积误差。然而,传统步进电机在整步或半步运行时存在振动大、噪音高、转矩波动明显等问题。为了解决这些问题,细分控制技术被广泛采用。细分控制通过对绕组电流进行精确控制,使转子在两个整步之间实现平滑移动,从而提升电机的运行平稳性和位置精度。本教程将带你使用搭建一个步进电机细分控制系统的仿真模型,并通过仿真分析其。

amy_mhd的博客 426

YOLOv8魔改系列:将CIoU替换成Wise-IoU,飞速涨点

将YOLOv8中CIoU替换成Wise-IoU,实现飞速涨点

qq_66386046的博客 2679

默认参数,内联函数,constexptr函数。

constexpr函数是指能用于常量表达式的函数函数的返回值类型及所有的形参类型都得是字面值类型,而且函数体中必须有且只有一条return语句。constexpr函数被隐式的指定为内联函数。constexpr函数不一定返回常量表达式。仅仅为自己的学习记录请大家谨慎参考。内联函数可以避免函数的开销。constexpr函数。...

m0_51008945的博客 232

【目标检测】全局上下文感知的详解

目标检测中的全局上下文感知(Global Context Awareness)​是指模型在定位和识别目标时,能够有效利用图像中全局或大范围的上下文信息(如场景语义、目标间关系、空间布局等),而不仅仅依赖局部特征。这种能力显著提升了检测的鲁棒性,尤其是在复杂场景(如遮挡、小目标、密集目标)中表现突出。

浩瀚之水的专栏 644

Effective C++ 条款03:尽可能使用const

Effective_C++_03

君鼎的博客 446

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Effective C++条款03:尽可能地使用const

条款三:尽可能地使用const 首先,我们需要知道const的作用:const是C++中的关键字,它允许我们指定一个语义的约束。 const分为两种:       1、顶层const:                顶层const的语法位置处于指针的右边,其作用是表明该指针不可指向其他对象,即:指针的自身是一个常量。                           eg:char *...

Dylan的博客 304

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Effective C++之条款03:尽可能使用const

声明: 文中内容收集整理自《Effective C++(中文版)第三版》,版权归原书所有。 本内容在作者现有能力的基础上有所删减,另加入部分作者自己的理解,有纰漏之处敬请指正。 条款03:尽可能使用const Use constwhenever possible. const是个很奇妙的东西,自己在编程开发中深有体会,它告诉编译器和其他程序员某值应该保持不变。 const语法虽然变化多端...

HakunaMatata的博客 247

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Effective C++条款03:尽可能使用const

如果关键字const出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量. 有些程序员会将关键字const写在类型之前,有些人写在类型之后。这两种写法的意义相同,比如: 假如有以下的类: 这个类将operator[]声明为const成员函数,而该函数却返回一个引用指向对象内部值. 这种情况导致了所谓的logical constness.一个const成员函数可以修改它所处理...

qq_44800780的博客 295

Effective C++条款03解读:尽可能使用const

我对const还是有点感触的, 每次看到这样的代码, 我巴不得把代码作者揪出来问个究竟: #include using namespace std; int main() { char *p = "bad"; return 0; } 代码的作者丝毫没有意识到问题所在么? 那你看看这个代码: #include using namespace std; int main(

认知 行动 坚持 7272

一起读《Effective C++》: 条款03:尽可能使用const

一起读《Effective C++》: 条款03:尽可能使用const 文章目录一起读《Effective C++》: 条款03:尽可能使用const条款03:尽可能使用const1. 定义一个常量指针?指针常量?STL迭代器与const 条款03:尽可能使用const Use const whenever possible. 1. 定义一个常量指针?指针常量? 条款03 上来直接整一个比较容易记混 的 知识点,使用const来定义 指针和指针所指的变量 为常量: char greeting[]

阴无月的博客 277

Effective C++ 条款 03:尽可能使用 const

使用const可以帮助编译器检测错误的用法。const可用于任何作用域内的对象、函数参数、函数返回类型和成员函数。编译器强制实施,但开发者应更关注“概念上的常量性”。通过mutable可以释放对某些非静态成员变量的限制。通过让非const成员函数调用const版本,可简化代码并减少重复。

weixin_42255569的博客 555

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

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

qq973177663的专栏 564

Effective C++ 条款03:尽可能使用 const

深入解析 Effective C++ 条款03,全面掌握 const 的正确用法,理解 const 在指针、函数、类成员中的语义差异,以及 const 如何帮助编译器优化代码并提升程序安全性。

凡人叶枫的博客 490

《Effective C++》条款03(尽可能的使用const)

条款03 尽可能的使用const const出现形式 const关键字形式多种多样,对于普通变量的使用其规则就很多,如下图所示: const关键字总结:const关键字出现在“ * ”号左边,表示被指对象为常量,如果const出现在“ * ”右边,表示指针自身为常量;如果const关键字即出现在“ * ”左边又出现在“ * ”右边,那么指针和被指对象都是常量。 如下表示的指针情况相同: STL中的常量迭代器和指向常量的迭代器 形如指针和const结合一样,迭代器也有两种版本,分别是指向常量的迭代器和常量

qq_44664843的博客 295

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

条款03:尽可能使用const 一、顶层const和底层const 区分一下: int a = 1; const int* pa = a;//底层const,a的值不能变 int b = 2; int* const pb = b;//顶层const,pb的值不能变,即不能更改pb的指向 注意除了指针这种复合类型,其余基本类型的变量设置const全部为顶层const 二、const作用于迭代器 声明一个const迭代器与顶层指针类似: const vector<int>::iterator it

日月既往,不可复追 680

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

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

Do-Program的专栏 344
上一篇: [Effective C++]条款02:尽量以const, enum, inline替换#define
下一篇: [Effective C++]条款04:确定对象被使用前已先被初始化
Tim_10
博客等级 码龄2年 162粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值