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

一、、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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值