首页 > 编程语言 >C++ const和mutable

C++ const和mutable

时间:2023-08-20 16:48:44浏览次数:46  
标签:const name C++ 修饰 mutable string 函数

const和mutable

这里只说const在c++中的特殊用法。用const修饰函数的成员函数。

被const修饰的成员函数无法修改函数内的其他成员。可以认为这个函数变成了一个“只读”的状态。

Like this:

// 注意const在括号后面,不要写成const xx xxx(){...}了
int getStatus() const{
	return m_status;
}

而mutable意为“可变”,与const相反。上面说到被const修饰的成员函数无法修改函数内的其他成员。但是如果有一个成员函数被mutable修饰,就可以在const函数内修改值(可以理解为抵消了const的效果)。

下面是一个const函数和mutable的例子:

#include<iostream>

using namespace std;

class Entity {
private:
	string m_name;
	mutable int test = 0;
public:
	Entity(string name = "unnamed") {
		m_name = name;
	}
	string getName() const {
		//m_name = "Test"; 不能修改,成员函数有const修饰
		test = 1; // 可以修改,因为有mutable修饰
		/*
			虽然在const函数中尝试改变某个变量似乎没什么意义
			但是有时候在debug时可以修改某个值可能方便我们调试,这完全没什么问题
		*/
		return m_name;
	}
	string getName() {
		// 一个没有const修饰的版本
		// 如果只有这个版本,没有上面那个版本,printName函数就会报错
		return m_name;
	}
	void setName(string name = "unnamed") {
		m_name = name == "unnamed" ? m_name : name;
	}
};

void printName(const Entity &e) {
	// const Entity 只能调用有const修饰的成员
	cout << e.getName() << endl;
}

int main() {
	Entity e;
	printName(e);
	e.setName("The World");
	printName(e);
	return 0;
}

ps:虽然在const函数中尝试改变某个变量似乎没什么意义,但是有时候在debug时可以修改某个值可能方便我们调试,这完全没什么问题。举个例子, 在debug中, 有时我们想知道这个const函数被调用了多少次. 然后弄个计数器, 这个计数器要在const函数中改变值, 就需要用mutable标记.

标签:const,name,C++,修饰,mutable,string,函数
From: https://www.cnblogs.com/orzmiku/p/17644207.html

相关文章

  • C++ new和delete
    new关键字在C++中,当我们在函数内声明一个变量时,变量会被放在栈(stack)中。栈中的内存离开代码块就被释放了。而且栈的内存很小,当我们声明了大量变量可能会导致内存不足。内存除了栈以外,还有堆(heap),当我们在函数外声明一个全局变量时,这个变量就放在堆上。堆是程序未使用的内存,可以被......
  • c++ 丢失笔记 [运算符重载、this指针、复制与拷贝构造、生存周期、箭头操作符]
    运算符重载、this指针、复制与拷贝构造、生存周期、箭头操作符有一部分是学校的OJ里做题需要就提前学了,然后没记笔记,有一部分是笔记丢了。不打算补这些笔记。不过还是在这里mark一下++运算符的重载。因为++运算符可以前置也可以后置,所以这里需要注意一下,如果是后置++,需要一个in......
  • C++ 隐式转换与explicit关键字
    隐式转换与explicit关键字隐式转换函数构造的隐式转换,直接上代码:#include<bits/stdc++.h>classEntity{private: std::stringm_Name; intm_Age;public: Entity(conststd::string&name) :m_Name(name),m_Age(-1){} Entity(intage) :m_Name("Unknown"),m_A......
  • C++ Vector数组优化
    Vector数组优化问题这是一段没有优化的代码:#include<iostream>#include<vector>classEntity{public: intx,y;public: Entity(intx,inty) :x(x),y(y){} Entity(constEntity&e) :x(e.x),y(e.y){ std::cout<<"Copied!"<<st......
  • C++ 智能指针
    智能指针使用智能指针需要引入memory头文件unique_ptr#include<iostream>#include<string>#include<memory>classEntity{public: Entity(){ std::cout<<"CreatedEntity!"<<std::endl; } ~Entity(){ std::cout<<&q......
  • C++ 链接库
    C++中使用库分为两种,静态库和动态库。简单来说,静态库最后会被编译进二进制文件,动态库不会,需要二进制文件从外部载入。以下操作均在VisualStudio2022中进行,以32位GLFW为例子(glfw.org)。首先下载glfw32位的可执行程序。在解决方案目录创建一个Dependencies文件夹(名字无所谓),然后......
  • C++ 创建库并使用
    创建库并使用!>使用VisualStudio2022创建项目和解决方案首先创建一个空项目,这里叫Game,同时VisualStudio会帮你创建解决方案。这个项目是我们的应用程序。创建项目来存库!>以静态库为例、右键解决方案,添加新项目Engine。此时就有了两个项目,Game和Engine:打开E......
  • C++ 类
    类类是一种把数据和功能结合在一起的方法。使用class来定义一个类,像这样:classPlayer{//创建一个Player类intx=0,y=0;intspeed=1;};通过类创建一个对象(实例化),像这样:Playerplayer;成员变量可以使用点(.)来访问对象的属性。player.speed=2;但......
  • C++ 类和结构体内外的Static
    类和结构体外的Static这里的static指的是在类外的static,意味着你要声明的是static的符号,链接将只在内部。(换句话说作用域只在他所在的.cpp文件)。下面是几组例子来理解:例子1:main.cpp#include<iostream>usingnamespacestd;voidfun(){cout<<"fun()inmain.cpp"......
  • C++ 继承
    继承一个类可以继承另一个类,避免了代码复写。被继承的类被叫做基类,继承的类叫做派生类。(或者说是父类和子类)继承类型当一个类派生自基类,该基类可以被继承为public、protected或private几种类型。继承类型是通过上面讲解的访问修饰符access-specifier来指定的。我们几乎......