c++ || mutable_explicit_volatile关键字

21 篇文章 0 订阅

mutable(去除常性)

  • 修饰普通变量,被mutable修饰的变量,将永远处于可变的状态,mutable在类中只能够修饰非静态数据成员
  • 即使在一个const函数中,甚至结构体变量或者类对象为const,其mutable成员也可以被修改。
class Test                 //mutable
{
public:
	int ma;
	mutable int mb;
public:
	Test() :ma(0),mb(0) { cout << "Test()" << endl; }
	Test(int x=0,int y=0) :ma(x),mb(y) { cout << "Test(int ,int )" << endl; }
	~Test() { cout << "~Test()" << endl; }
	int GetMb()const
	{
		return mb+1;//加了const表明参数不能被修改
		//但是mb前有mutable关键字 所以它在任何情况下都可以进行改变
	}
	int GetMa()const {
		//return ma++ ;  错误 const不能修改
		return ma;
 	}
};

int main() {
	const Test t(20, 33);
	//t.ma = 29;     //const常对象 不能进行修改
	t.mb = 66;     //不会出错 mb定义前有mutable关键字 去除常性
	cout << t.GetMb() << endl;
	cout << t.GetMa() << endl;

}

explicit(阻止隐式转换)

  • 阻止隐式转换的发生,声明为explicit的构造函数不能在隐式转换中使用。
  • 隐式转换即是可以由单个实参来调用的构造函数定义了一个从形参类型到该类类型的隐式转换。编译器在试图编译某一条语句时,如果某一函数的参数类型不匹配,编译器就会尝试进行隐式转换,如果隐式转换后能正确编译,编译器就会继续执行编译过程, 否则报错。
class String {
public:
	explicit String(int n) { cout << "String(int):  " << this << endl; }
	String(const char* c) { cout << "String(char):  " << this << endl; }
	~String() { cout << "~String():  " << this << endl; }
};
int main()
{
	String s1 = "c";  //隐式调用String(const char *c) 在调用拷贝构造函数
	//String s2 = 20;   不能做隐式int->String转换
	String s3(30);    //调用explicit String(int)
	String s4 = String(99); //先调用explicit String(int) 在调用默认的拷贝构造函数
}

volatile(禁止代码优化)

  • 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次需要从内存中重新读取这变量的值。

  • 变量如果加了 volatile 修饰,则会从内存重新装载内容,而不是直接从寄存器拷贝内容。

  • 用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能重复使用放在cache或寄存器中的备份。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Apollo Probo是一个流行的开源C/C++测试框架,用于进行单元测试和集成测试。在Apollo Probo中,mutable_header是一个关键的概念,它允许在测试过程中修改HTTP请求的头部。 通常情况下,HTTP请求的头部是不可更改的,因为它们包含了关键的信息,如身份验证令牌、内容类型等。然而,在测试中可能需要修改某些头部,以模拟不同的场景或条件。 使用mutable_header可以实现这个目的。通过调用mutable_header函数,并传递HTTP请求对象和要修改的头部名称以及新的头部值,可以在测试中动态地更改头部。 以下是一个示例代码片段,展示了如何在Apollo Probo中使用mutable_header: ```cpp #include <probo/HttpRequest.h> // 创建一个HttpRequest对象 probo::HttpRequest request; // 设置初始的头部信息 request.set_header("Content-Type", "application/json"); request.set_header("Authorization", "Bearer token"); // 打印初始的头部信息 std::cout << "Original headers:\n"; for (const auto& header : request.headers()) { std::cout << header.first << ": " << header.second << "\n"; } // 使用mutable_header修改头部信息 request.mutable_header("Authorization", "NewToken"); // 打印修改后的头部信息 std::cout << "Modified headers:\n"; for (const auto& header : request.headers()) { std::cout << header.first << ": " << header.second << "\n"; } ``` 在上面的示例中,我们首先设置了初始的头部信息,然后调用mutable_header函数将Authorization头部的值更改为"NewToken"。最后,通过遍历headers()函数返回的头部列表,我们可以验证头部是否被成功修改。 希望这个

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值