gpt4 book ai didi

c++关键字mutable深入解析

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 29 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章c++关键字mutable深入解析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

C++中的mutable关键字 。

mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词.

在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中.

我们知道,被const关键字修饰的函数的一个重要作用就是为了能够保护类中的成员变量。即:该函数可以使用类中的所有成员变量,但是不能修改他们的值。然而,在某些特殊情况下,我们还是需要在const函数中修改类的某些成员变量,因为要修改的成员变量与类本身并无多少关系,即使修改了也不会对类造成多少影响。当然,你可以说,你可以去掉该函数的const关键字呀!但问题是,我只想修改某个成员变量,其余成员变量仍然希望被const保护.

经典的应用场景比如说:我要测试一个方法的被调用次数.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
class Person {
public :
  Person();
  ~Person();
 
  int getAge() const ; /*调用方法*/
  int getCallingTimes() const ; /*获取上面的getAge()方法被调用了多少次*/
private :
  int age;
  char *name;
  float score;
  int m_nums;  /*用于统计次数*/
};

最普遍的作法就是在getAge()的方法体内对m_nums这个变量进行加+1,但是getAge()方法又是const方法,无法修改m_nums这个变量,我又不想去掉const关键字让别人能够修改age等成员变量,这个时候mutable关键字就派上用场了:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
 
class Person {
public :
  Person();
  ~Person();
 
  int getAge() const ; /*调用方法*/
  int getCallingTimes() const ; /*获取上面的getAge()方法被调用了多少次*/
private :
  int age;
  char *name;
  float score;
  mutable int m_nums;  /*用于统计次数*/
};
 
Person::Person()
{
  m_nums = 0;
}
 
Person::~Person(){}
 
int Person::getAge() const
{
  std::cout << "Calling the method" << std::endl;
  m_nums++;
  // age = 4; 仍然无法修改该成员变量
  return age;
}
 
int Person::getCallingTimes() const
{
  return m_nums;
}
 
int main()
{
  Person *person = new Person();
  for ( int i = 0; i < 10; i++) {
  person->getAge();
  }
  std::cout << "getAge()方法被调用了" << person->getCallingTimes() << "次" << std::endl;
  delete person;
 
  getchar ();
  return 0;
}

运行结果:

Calling the method Calling the method Calling the method Calling the method Calling the method Calling the method Calling the method Calling the method Calling the method Calling the method 。

getAge()方法被调用了10次 。

这样我们既保护了别的成员变量,又能够使计数器的值进行累加.

需要注意的是:mutable不能修饰const 和 static 类型的变量.

1、关于mutable关键字 。

先说用法,mutable关键字只能修饰非静态以及非常量成员变量,使用mutable修饰的成员变量在const函数中的值是可以修改的.

比如说下面的代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Demo
{
public :
   Demo() {}
   ~Demo() {}
public :
   bool getFlag() const
   {
     m_nAccess++;
     return m_bFlag;
   }
private :
   int m_nAccess;
   bool m_bFlag;
};
 
int main()
{
   return 0 ;
}

编译的时候会报错,因为const成员函数修改了成员变量,但是如果声明m_nAccess的时候加上关键字mutable就可以了.

PS:一个对象的状态由该对象的非静态数据 成员决定,所以随着数据成员的改变, 对像的状态也会随之发生变化! 如果一个类的成员函数被声明为const类型,表示该函数不会改变对象的状态,也就是该函数不会修改类的非静态数据成员.但是有些时候需要在该类函数中对类的数据成员进行赋值.这个时候就需要用到mutable关键字了.

最后此篇关于c++关键字mutable深入解析的文章就讲到这里了,如果你想了解更多关于c++关键字mutable深入解析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com