• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

c++中explicit与mutable关键字的深入探究

c++ 搞代码 4年前 (2022-01-06) 23次浏览 已收录 0个评论

这篇文章主要给大家介绍了关于c++中explicit与mutable关键字的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

今天说一说c++里面的两个关键字explicit和mutable。

1. explicit关键字

在写c++标准输入输出相关文来源gaodaimacom搞#代%码网章,查看iostream实现代码的时候,经常看到构造函数前面带有explicit关键字,那么它到底有什么作用呢。

explicit用来防止由构造函数定义的隐式转换,先看这样一段代码:

 #include  class Base { private: int a; public: Base(int p_a){ a = p_a;} ~Base(){} void print() { std::cout << "a=" << a << std::endl; } }; int main() { Base base = 5; base.print(); base = 6; base.print(); return 0; } 

声明一个只有一个int类型私有成员变量的类,这个时候没有使用explicit关键字,那么可以直接使用class Base base = 5;来给成员变量赋值,这也就算了,就当他是在构造了,但是到了base = 6这一行代码,就很离谱了,没有调用任何set函数,直接就改变了私有成员的值,这就相当于,你自己房子里面放的钱,别人可以隔墙修改你的钱的数量,想想看,你有10000块钱放家里,有个人手指一点,钱变成100了,是不是很可怕。

但如果在构造函数前面加一个explicit关键字,那么代码就不能再这样写啦,编译会报错,如下:

 //构造函数前面加explicit explicit Base(int p_a){ a = p_a;} 

报错内容类似这样的:test.cpp:19:14: error: conversion from ‘int’ to non-scalar type ‘Base’ requested,这样就避免了别人隔墙修改你家钱的数量啦。

那么为什么explicit可以起到这个作用呢,在没有声明该关键字之前,编译器根据当前的定义和构造函数,在编译的时候做了一个隐式的类型转换,但是当编译器发现了explicit这个关键字之后,就不再做这个隐式转换,这个时候等号两边的值类型很明显就不一样,当然会报编译错误啦。

总结:explicit告诉别人,不允许隔墙修改我家钱的数量,你要修改的话,必须进到屋子里才行。

2. mutable关键字

mutable用于类的非静态和非常量数据成员,一般类的成员函数被声明为const,就表示不会修改类的数据成员,但如果要在常成员函数中修改类的非静态和非常量数据成员,则可以使用mutable修饰该数据成员,如下:

 #include  class demo { public: int getCnt() const { m_nCount++; return m_nCount; } private: int m_nCount; }; int main() { return 0; } 

编译会报错:test.cpp:13: 错误:increment of data-member ‘demo::m_nCount' in read-only structure,但如果改为如下代码:

 #include  class demo { public: int getCnt() const { m_nCount++; return m_nCount; } private: mutable int m_nCount; }; int main() { return 0; } 

在int类型前面加一个mutable关键字,编译就通过了。

总结:mutable允许你在一个固定不变的房子里面放置某些可变的物件。

以上就是c++中explicit与mutable关键字的深入探究的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:c++中explicit与mutable关键字的深入探究

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址