您的位置:首页 > 编程语言 > C语言/C++

c++ 基础知识整理(四)

2016-06-05 23:31 369 查看
一、、explicit

#pragma once
#include <iostream>

class explicit_test
{

public:
//只是想让他支持 int 类型来分配大小,
/*explicit*/ explicit_test(int length, const char* data = "")
{
std::cout << "explicit_test(int length,const char* data = "");\n";
}

explicit_test& operator =(const explicit_test& other)
{
std::cout << "explicit_test& operator=(const explicit_test& other);\n";
return *this;
}
};不带explicit 测试结果
explicit_test aa(5); //直接隐式转换,可以传一个参数是因为该构造函数的第二个参数有默认值

aa = 34.3;
aa = 'a';
上面让我们感觉到歧义,分不清是这个类是干啥用的额,不知道为啥float,chat也可以正常调用ctor,可以肯定的是,这种不是转换不是我们想要的。
我们在看看 带有explicit 的结果:

explicit_test aa(5); //直接隐式转换,可以传一个参数是因为该构造函数的第二个参数有默认值

aa = 34.3;
aa = 'a';

//在explicit_test构造函数加explicit 会报错
//1>f:\owersource\c++_test\c++_test\c++_test.cpp(11) : error C2679 : 二进制“ = ” : 没有找到接受“double”类型的右操作数的运算符(或没有可接受的转换)
// 1>          f:\owersource\c++_test\c++_test\explicit.h(14) : 可能是“explicit_test &explicit_test::operator =(const explicit_test &)”
// 1>          尝试匹配参数列表“(explicit_test, double)”时
// 1>f:\owersource\c++_test\c++_test\c++_test.cpp(12) : error C2679 : 二进制“ = ” : 没有找到接受“char”类型的右操作数的运算符(或没有可接受的转换)
// 1>          f:\owersource\c++_test\c++_test\explicit.h(14) : 可能是“explicit_test &explicit_test::operator =(const explicit_test &)”
//这才是我们想要的结果,我可以把有可能未知的逻辑错误控制编译期。

//从上面看 explicit 是抑制隐式转换的。除非是在你有意进行隐式转换,否则最好cotr都加上explicit来控制隐式转换,让他转换在我们可预期范围。

结论:在你不是有意的情况下,都应该加explicit
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++