首页 > 编程语言 >C++自学笔记17(const和mutable)

C++自学笔记17(const和mutable)

时间:2024-07-26 12:25:05浏览次数:21  
标签:std const 17 int GetName C++ Entity include

const

在之前的笔记中我们出现很多次const char* name = “shaojie”,定义一个不可变指针存放字符串。

不可变就来自const,表示“只读、常量”为什么需要它呢?我们需要一些东西不可被修改。

const加数据变量

#include <iostream>

int main()
{
    const int MAX_AGE = 99;
    MAX_AGE = 250;
}

打印出的MAX_AGE 依旧是99而不是250,因为我们将其定义为“常量”不可变。我们还可以对指针进行常量处理,我们在堆上创建一个整型指针我们赋值为其内容为2并修改其指向的地址偏移一位。

const加指针变量

#include <iostream>

int main()
{
    const int MAX_AGE = 99;
    MAX_AGE = 250;

    int* a = new int;
    *a = 2;
    a = a+1;
}

对于指针我们可以修改指针地址和指针指向的内容两个东西。

#include <iostream>

int main()
{
    const int MAX_AGE = 99;
    MAX_AGE = 250;

    const int* a = new int;//int const * a = new int;
    *a = 2;
    a = a+1;
}

 const加在*前我们不可以修改指针指向的内容,也就是说*a = 2不好使了。为什么说加载*前?因为对于编译器来说const int* a与int const *a是一个东西,看个人书写习惯。

const加在*之后,我们不可以修改指针指向的地址,就是a = a+1咩有用了。

#include <iostream>

int main()
{
    const int MAX_AGE = 99;
    MAX_AGE = 250;

    int* const a = new int;
    *a = 2;
    a = a+1;
}

两种写法就类似可见性时的几个关键字一样,两种方式让内容或地址不可更改。 

const加方法

方法只在类中是函数别名

class Entity
{
private:
    int m_X,m_Y;
public:
    int GetPoint()
    {
        return m_X;
    }

    void SetPoint(int x)
    {
        m_X = X; 
    }
};

GetPoint方法只是返回m_X的值,我们不希望有人修改它怎么办? 

class Entity
{
private:
    int m_X,m_Y;
public:
    int GetPoint() const
    {
        //m_X = 2;
        return m_X;
    }

    void SetPoint(int x)
    {
        m_X = X; 
    }
};

如果在GetPoint让m_X赋值为2是做不到的。这就让方法有了只读的性质。

我们将私有成员换成指针变量。

class Entity
{
private:
    int* m_X,*m_Y;
public:
    const int* const GetPoint() const
    {
        //m_X = 2;
        return m_X;
    }

    void SetPoint(int x)
    {
        m_X = X; 
    }
};

 还记得这三个const的含义吗?第一个不改内容、第二个不改地址、第三个不改方法中成员变量。

还有一件事

class Entity

private:
    int* m_X,*m_Y;

 对于整型变量我们可以用“,”并列定义,在指针中要记得“*”符号。

然而 const就像是承诺这个MAX_AGE 是一个不变量,那想想你承诺每天背单词,是不是也有不背的时候。const也有例外。

mutable

容易改变,常用在const不可改变的环境下。 

#include <iostream>
#include <string>

class Entity
{
private:
    std::string m_name;
publiic:
    const std::string& GetName() const
    {

        return m_name;
    } 
};
int main()
{
    const Entity e;
    e.GetName();

    std::cin.get();
}

 const std::string& GetName() const

第一个const表示GetName方法不可更改,第二个const表示GetName内部的私有变量不可更改。

我们在main创建一个不可改变的Entity,我们可以调用GetName方法,。

然而,我们去掉const std::string& GetName() const第二个const就不可引用了。

#include <iostream>
#include <string>

class Entity
{
private:
    std::string m_name;
publiic:
    const std::string& GetName()
    {
        count++;
        return m_name;
    } 
};
int main()
{
    const Entity e;
    e.GetName();//报错

    std::cin.get();
}

 所以要使用GetName方法我们必须加入const,那如果我想知道GetName在函数内执行了多少次会发生什么呢?

#include <iostream>
#include <string>

class Entity
{
private:
    std::string m_name;
    int count;
publiic:
    const std::string& GetName()const
    {
        count++;
        return m_name;
    } 
};
int main()
{
    const Entity e;
    e.GetName();

    std::cout<<count<<std::endl;//报错

    std::cin.get();
}

std::cout<<count<<std::endl;会报错 原因是什么呢?

 const std::string& GetName() const第二个const让方法内变量count和m_name不可更改,然而我们只想改变count。去掉这个const的话GetName函数会报错,所以怎么办呢?

#include <iostream>
#include <string>

class Entity
{
private:
    std::string m_name;
    mutable int count;
publiic:
    const std::string& GetName()const
    {
        count++;
        return m_name;
    } 
};
int main()
{
    const Entity e;
    e.GetName();

    std::cout<<count<<std::endl;

    std::cin.get();
}

 只要在count前加入mutable即可

标签:std,const,17,int,GetName,C++,Entity,include
From: https://blog.csdn.net/weixin_64418869/article/details/140678759

相关文章

  • C++自学笔记18(成员初始化列表和初始化对象)
    成员列表初始化创建变量,并将其初始化是创建函数的必要部分。#include<iostream>#include<string>classEntity{private:std::stringm_name;public:Entity(){m_name="nothing"}Entity(conststd::string&name){......
  • C++ primer plus 第16章string 类和标准模板库, 函数符概念
    C++primerplus第16章string类和标准模板库,函数符概念C++primerplus第16章string类和标准模板库,函数符概念文章目录C++primerplus第16章string类和标准模板库,函数符概念16.5.1函数符概念程序清单16.15functor.cpp16.5.1函数符概念正如STL定......
  • C++ primer plus 第16章string 类和标准模板库, 函数对象
    C++primerplus第16章string类和标准模板库,函数对象C++primerplus第16章string类和标准模板库,函数对象文章目录C++primerplus第16章string类和标准模板库,函数对象16.5函数对象16.5函数对象很多STL算法都使用函数对象–也叫函数符(fiunctor)。......
  • 【Python】成功解决:`FileExistsError: [Errno 17] File exists: ‘xxx’`
    【Python】成功解决:FileExistsError:[Errno17]Fileexists:‘xxx’在Python编程中,处理文件和目录是常见的任务之一。然而,当我们尝试执行某些文件操作,如创建新文件或目录时,如果目标文件或目录已经存在,就可能会遇到FileExistsError异常。这个错误通常伴随着消息[Errno1......
  • 在Linux环境配置多版本jdk,这里以8和17为例
    步骤1:下载Java17JDK访问Oracle官网下载Java17JDK:打开浏览器,访问OracleJDK17下载页面。登录并接受许可协议:如果你是Oracle用户,登录你的账户。如果不是,你可能需要创建一个账户或接受Oracle的许可协议才能下载。选择Java17下载:在下载页面上,选择适合你的......
  • 当你第一次用C++string的assign会遇到这种情况
    当你第一次用string的assign时,会发现有一点小区别,见以下代码:stringstr1;str1.assign("helloC++");cout<<str1<<endl;stringstr2;str2.assign(str1,5);cout<<str1<<endl;stringstr3;str3.assign("helloC++",5);cout<<......
  • 使用pybind11封装c++的dll,供python调用
    用pip安装好pybind11 文件清单,都写在一个目录里//文件名:add.cppextern"C"doubleadd(doublein1,doublein2){returnin1+in2;}//文件名:sub.cppextern"C"doublesub(doublein1,doublein2){returnin1-in2;}//文件名:mul.cppextern"......
  • P9304 「DTOI-5」3-1题解,c++树的遍历例题
    题意给定以n(1≤n≤1......
  • C/C++默认生成的几个函数s
    一、关键词类/结构体默认生成。拷贝/移动+构造/赋值=组合不同方式有4种,除默认、析构,共计6种。在使用时:拷贝/移动+赋值的,都是定义和赋值分开;拷贝/移动+构造的,都是定义和赋值一起。二:知识点默认构造函数Student():age(0){};拷贝构造函数Student(constStudent&i......
  • C++ typeid 关键字的注意事项
    typeid 是C++的一个关键字,用于动态类型获取。typeid 运算符与RTTI(运行时类型信息)密切相关,它返回一个指向 std::type_info 对象的引用,该对象表示了表达式的类型。使用 typeid 时,需要注意以下几个方面:需要#include <typeinfo>头文件:要使用 typeid,应在代码中包含 <t......