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

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即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少杰是小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值