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 的结果:
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
#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++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性