C++编程技巧——常用const_列举cconst的常用方法

【const】指定了「不可被改动」的语义约束。它可以将各种变量修饰为常量,在修饰指针时出现在*左边表示被指物是常量,在*右边表示指针自身是常量。但const在函数声明时的运用更多:

一、令函数返回一个常量

这种做法往往可以降低用户的一些错误操作,比如【(a*b) = c】。尽管一般都知道这无意义,但不排除有人就是这样写了,如果你将【operator*】函数的返回值修饰为const就可以避免这种错误。

二、修饰成员函数

首先,const修饰成员函数的目的是为了表明这个函数不能改动对象内容。这里有两个理解,一是bitwise constness:成员函数不能修改对象的任何一个bit才可以被称为const。但在实际中,许多成员函数不具备这种要求却通过了编译器的bitwise测试,如下图:

【operator[]】理论上并不能修改【text】,但是通过指针却可以做到:

通过这种操作,【t】中的hello world被改为了jello world。因此就有了另一种解释logical constness:【const】成员函数可以修改一些对象内数据,只要客户看不到就行。为了通过编译器的bitwise测试修改一些对象内数据,需要使用【mutable】关键字修饰要更改的对象内数据。

三、修饰成员函数怎么避免【const】与非【const】函数代码重复

我们会对同一个功能写一个【const】版本函数和一个非【const】版本函数,这就造成两个函数代码高度重复。因此我们会使用非【const】版本函数调用【const】版本函数来避免此问题。这就需要一些转换:

通过【static_cast】将【this】指针转为【const】,再调用【const 类型 operator[]】。最后将返回值的【const】通过【const_cast】去除。需要注意的是,不要使用反向做法——【const】函数调用非【const】函数,毕竟你不知道非【const】函数做了什么,会不会修改对象数据。

相关文章

cython如何调用C语言的函数?_c 中如何调用python

在 Cython 中调用 C 语言函数主要通过以下几种方式实现:1. 使用 cdef extern 声明外部 C 函数基本语法cdef extern from "头文件.h":返回类型...

C/C++函数调用的奥秘_c++函数调用原理

在C/C++编程的世界里,函数调用是程序运行的核心机制之一。然而,许多程序员在日常开发中,往往只关注代码的逻辑,而忽略了函数调用背后的底层细节。今天,就让我们一起深入探索C/C++函数调用的全过程,从...

C++成员函数如何工作?this指针、name mangling 成员函数指针解析

0.引言 在C++面向对象编程中,成员函数是对象行为的核心载体。我们每天都在使用成员函数,但却很少深入思考其底层的实现机制:为什么成员函数可以直接访问成员变量?编译器如何区分不同类的同名函数?静态成员...

C语言入门:学生成绩管理程序的完善(1):用文件保存数据

这是C语言入门的第27篇文章。今天讲学生成绩管理程序的完善:怎样利用文件来保存数据。还是昨天的问题:我怎么知道一个文件的内容是什么?我怎么知道比如一行有多少个数,多少个数以后是换行?这是因为文件是我们...

C语言应用笔记:常用的printf打印输出不同类型数据

我叫程序员阿虾, 在终端前摸过太多凌晨, 熟悉printf这一行字带来的安心与危险。今天想跟你聊聊我踩过的坑, 和一些别人不常说的细节, 用第一人称把经验交给你, 有点唠叨, 希望你少走弯路。为什么要...

C语言应用笔记:简单的最大最小值比较

使用宏定义实现泛型比较函数,用于求取两个值的最大值和最小值。核心宏定义解析#define MAX(x, y) ((x) > (y) ? (x) : (y)) // 返回两个值中较大的一个 #de...