打破const的小不点儿

mutable是C++中的一个关键字,它允许在常量成员函数(const成员函数)中修改特定的成员变量,而不破坏对象的常量性。

C中没有类,自然也没有mutable关键字。

举个例子说明mutable的存在意义,比如你在展览一个非常珍贵的花瓶(一个C++类的对象),容不得对这个花瓶有半点改变,无论颜色、形状还是材质(成员变量)。但是,你希望记录下花瓶被多少人看过(访问次数),于是在花瓶上贴个标签(成员变量),在上面更新访问信息。显然,这个标签并不会影响到花瓶本身,无伤大雅,这就叫不破坏对象的常量性。

为了保证这个花瓶本身不改变,你设置了一套禁令(由const领衔主演的常量成员函数):不能在花瓶上涂鸦,不能用于烧烤,不能用作尿壶。这个常量成员函数保证不会修改对象中的成员变量,只有用mutable修饰的除外。

示例代码:

#include <iostream>
using namespace std;

class Vase {
private:
    string color; // 花瓶颜色,不能改变
    mutable int viewCount; // 访问次数,可改变

public:
    Vase(const string& c) : color(c), viewCount(0) {}

    // const成员函数,用于参观花瓶并增加访问次数
    void view() const {
        ++viewCount; // 由于viewCount是mutable的,所以可以在const函数中修改它
        // 注意:不能在const函数中改变color成员变量,因为它不是mutable的
        // 下面的试图更改花瓶颜色的代码会导致编译错误(如果取消注释)
        // color = "Green";
        cout << "Viewed a " << color << " vase. Total views: " << viewCount << endl;
    }
};

int main() {
    Vase myVase("Blue"); //定义一个蓝色花瓶

    // 参观花瓶(const函数),每参观一次增加一次访问次数
    myVase.view();
    myVase.view();

    return 0;
}

倘若某位大佬在参观时强列表示:要想艺术过得去,瓶子必须带点绿。那也很好办,只需撤掉主演const,就可以随意涂鸦了。

综上,mutable主要用于在不改变对象主要属性的前提下,更新一些额外信息。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: char和const char不兼容是因为它们的类型不同。char是一个可变的字符类型,而const char是一个不可变的字符类型。在C++中,const关键字用于指定变量的值不能被修改。因此,如果将一个char类型的变量赋值给一个const char类型的变量,编译器会发出不兼容的错误提示。 ### 回答2: char 和 const char 都是 C++ 中的数据类型,但是它们在一些情况下不兼容。这是因为它们具有不同的特性和使用方式。 首先,char 是一种基本数据类型,代表一个字节的数据。它通常用于表示字符和文本。这意味着我们可以修改 char 类型的变量的值,并在程序中使用它们来实现多种不同的功能。例如,我们可以使用 char 在控制台上输出字符串。 其次,const char 是一个限定符和指针类型。它是指向 char 类型的常量指针,这意味着我们不能修改 const char 指针所指向的内存地址的值。当我们声明一个 const char 指针时,我们必须初始化它来指向某个常量或者字符串字面值。例如,下面的代码创建了一个 const char 指针来指向一个字符串字面值: const char* str = "hello world"; 如果我们尝试使用 char 来表示一个常量,编译器将会发出警告,因为这违反了 const 修饰符代表的含义。例如: char* str = "hello world"; // 不合法,会发出警告 因此,char 和 const char 不兼容是因为它们具有不同的含义和用途。char 用于表示可以修改的数据,而 const char 用于表示不可修改的常量数据。在使用这些类型之前,我们必须清楚它们之间的区别,并谨慎使用它们。 ### 回答3: char和const char属于不同的数据类型,它们的兼容性存在一定的差异。 char是一种基本数据类型,用于表示一个字符,它的取值范围为-128到127(对于无符号char类型而言为0到255),占用一个字节的内存空间。而const char是一种指针类型,指向一个字符常量,声明时必须初始化,初始化后不能再修改其值。 因为char类型的变量可以修改其值,而const char类型的变量是常量,不能修改其值,所以它们的兼容性存在差异。具体来说,以指针为例,如果一个函数的参数为char*类型,而实参是const char*类型,那么在编译时会发生错误。这是因为在函数调用时,实参的类型必须与形参的类型匹配才能顺利传递参数,否则会发生类型不匹配的错误。 此外,在使用字符串时也存在兼容性的问题。传递给函数的字符串参数必须与函数定义中的形参类型匹配。如果函数的参数类型是const char*,而实参是char*类型的字符串,编译器会发出警告,因为char*类型的字符串指针可以修改其所指内存的值,而被const修饰的指针则不能进行这样的操作。如果函数内部对这样的指针进行了修改,那么会导致编译器错误。 综上所述,char和const char不兼容是因为它们的类型和用途不同,需要注意在参数传递和字符串使用时的兼容性问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

金创想

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

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

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

打赏作者

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

抵扣说明:

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

余额充值