认识 C++ 中的explicit 关键字
作者:网络转载 发布时间:[ 2014/5/27 11:49:13 ] 推荐标签:C++ explicit net
带单一参数的构造函数在缺省情况下隐含一个转换操作符,请看下面的代码:
class MyClass{
public:
MyClass(int nParam);// 带一个参数的构造函数
private:
int m_nData;
}
void fun(){
MyClass c(0);
c =5; // 将5隐式转换为MyClass对象
}
|
编译器重新编辑上述例子代码,如下:
/////////////////////////////////////////////////////////////////////
//"c=5;" 被编译器转换成下面这个样子:
/////////////////////////////////////////////////////////////////////
MyClass temp(5);// 实例化一个临时对象,
c = temp; // 用 = 赋值
temp.MyClass::~MyClass(); // temp 的析构函数被激活
|
在很多情况下,这个转换是有意的,并且是正当的。但有时我们不希望进行这种自动的转换,例如:
class String {
int size;
char *p;
public:
String (int sz); //这里不希望进行隐式转换操作
};
void f ()
{
String s(10);
// 下面是一个程序员的编码;发生一个意想不到的转换:
s = 100; // 糟糕,100 被转换为一个 String,然后被赋值给 s
}
为了避免这样的隐式转换,应该象下面这样显式声明该带单一参数的构造函数:
class String {
int size;
char *p;
//..
public:
// 不要隐式转换
explicit String (int sz);
String (const char *s, int size n = 0); // 隐式转换
};
void f ()
{
String s(10);
s = 100; // 现在编译时出错;需要显式转换:
s = String(100); // 好;显式转换
s = "st"; // 好;此时允许隐式转换
}
|
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南