首页 > 其他分享 >std::optional

std::optional

时间:2024-07-27 17:06:20浏览次数:10  
标签:std const 变量 成员 修改 mutable optional 函数

mutable

在C++中,mutable 关键字的主要作用是允许类的成员变量在常量成员函数中被修改。常量成员函数是用 const 关键字修饰的成员函数,通常不允许修改类的成员变量。然而,有时我们希望在这些常量成员函数中修改某些特定的成员变量,比如缓存、调试信息等。为了实现这一需求,可以使用 mutable 关键字。

以下是 mutable 的几个主要作用:

  1. 允许在 const 成员函数中修改变量

    通过将类成员变量声明为 mutable,可以在常量成员函数中修改这些成员变量,而不会违反 const 约束。

  2. 便于实现懒加载和缓存
    在某些情况下,计算一个值可能是昂贵的操作。我们可以使用 mutable 关键字来存储缓存的结果,并在需要时更新它,即使是在 const 成员函数中。

  3. 便于调试信息的记录
    在调试时,我们可能希望在 const 成员函数中记录一些调试信息。可以使用 mutable 关键字来允许修改调试记录变量。

示例代码

下面是一个使用 mutable 关键字的示例:

#include <iostream>
#include <string>

class MyClass {
private:
    std::string data;
    mutable int accessCount; // 允许在 const 成员函数中修改

public:
    MyClass(const std::string& str) : data(str), accessCount(0) {}

    std::string getData() const {
        ++accessCount; // 修改 mutable 成员变量
        return data;
    }

    int getAccessCount() const {
        return accessCount;
    }
};

int main() {
    MyClass obj("Hello, World!");
    std::cout << obj.getData() << std::endl;
    std::cout << obj.getData() << std::endl;
    std::cout << "Data accessed " << obj.getAccessCount() << " times." << std::endl;
    return 0;
}

在这个示例中,MyClass 类有一个 mutable 成员变量 accessCount,用于记录 getData() 函数的调用次数。即使 getData() 是一个 const 成员函数,它仍然可以修改 accessCount 变量。运行这段代码时,会输出:

Hello, World!
Hello, World!
Data accessed 2 times.

使用 mutable 的注意事项

尽管 mutable 关键字很有用,但应谨慎使用。滥用 mutable 可能会使代码变得难以理解和维护。最好仅在确实需要修改成员变量且这种修改不会破坏类的逻辑一致性时才使用 mutable。

标签:std,const,变量,成员,修改,mutable,optional,函数
From: https://www.cnblogs.com/codeSweet/p/18327170

相关文章

  • NotRequired 和Optional 的通用类型别名
    在typing.TypedDict中,NotRequired字段与声明值Optional的字段之间存在差异。第一个意味着该键可能不存在,后者意味着现有键上的值可能是None在我的上下文中(使用mongodb),我不想区分这一点,只是允许一个字段既NotRequired又Optio......
  • std的map或者set中,比较浮点类型二维三维数据
    在map和set中,如果比较对象是二维或者三维数据,需要把二维三维数据的浮点数转换为比较精度。如果比较精度是0.001,那么数据的精度也必须是0.001,不然会出现如下情况:比较函数 structPoint001Comp{booloperator()(constPoint*l,constPoint*r)const{i......
  • C++ printf/std::cout如何重定向到日志文件中
    在C++中,可以使用标准库中的头文件提供的ofstream类来打开文件,并使用std::freopen函数将stdout重定向到该文件。以下是一个示例代码,展示如何将printf输出重定向到日志文件中:#include<cstdio>#include<fstream>intmain(){std::ofstreamlogFile("log.txt",std::ios:......
  • C++标准模板(STL)- 概念库 (C++20) - 指定一个类型派生自另一类型 - (std::derived_from)
    概念库提供基础语言概念的定义,它们能用于进行模板实参的编译时校验,以及基于类型属性的函数派发。这些概念在程序中提供等式推理的基础。标准库中的大多数概念一同加上了语法及语义要求。通常,编译器只能检查语法要求。若在使用点语义要求未得到满足,则程序为病式,不要求诊断。......
  • 深入分析:std::lock_guard 的使用及其最佳实践
    ......
  • 将 python 脚本的 stdin 重定向到 fifo 会导致 RuntimeError: input():lost sys.stdin
    我有这个python脚本,它的作用是充当服务器,它从重定向到fifo的stdin读取命令:test.py:whileTrue:try:line=input()exceptEOFError:breakprint(f'Received:{line}')在bash中运行命令:mkfifotestfifotest.py<testfifo......
  • 如何使用C++中的字符串类(如std::string)
    在C++中,std::string 类是标准模板库(StandardTemplateLibrary,STL)的一部分,它提供了对字符串的灵活处理。std::string 使得字符串的存储、操作、比较、查找等任务变得更加方便和高效。下面将介绍如何使用 std::string 类。1.包含头文件要使用 std::string,首先需要包含......
  • std::optional
    在C++17中,std::optional是一个非常有用的类型,它用于封装一个可能不存在的值。它提供了一种安全的方式来处理可能为空的值,避免了使用NULL或nullptr带来的问题。以下是std::optional的一些基本用法:创建std::optional对象:使用std::nullopt或std::make_option......
  • optional
    作用:用来包装一个可能存在也可能不存在的值当存在时我们可以选择返回其中内容,不存在时返回空;代码示例:#include<iostream>#include<optional>#include<string>#include<fstream>std::optional<std::string>ReadFileAsString(conststd::string&filepath){std::i......
  • asyncio/trio fastdfs python client
    Codets.py#!/usr/bin/envpython"""FastDFS并发测试脚本Usage::$python<me>.py200--show"""importfunctoolsimportitertoolsimportjsonimportosimportpickleimportsysimporttimefrompathlibimportPathfr......