C++ explicit关键字

1 测试代码部分

  1. 将代码拷贝到自己的工程中
  2. 运行后发现可以实现 Complex c2 = c1 + 5; 正常来说,5不是一个Complex,为何可以通过操作符重载实现相加呢
    (正常情况下,这一步运算之所以可以实现,是因为imag默认值为0,所以当+号运算符被重载后
    编译器会自动将5转换为Complex类,然后通过+号进行运算)
    在这里插入图片描述
  3. 在构造函数Complex(int r1, int ima1=0) :real(r1), imag(ima1) {};之前加上explicit,发现会提示没有操作数与+匹配,这就是explicit的作用
#include <iostream>
using namespace std;
class Complex
{
private:
	int real;
	int imag;
public:
	//explicit   在Complex(int r1, int ima1=0) :real(r1), imag(ima1) {};前
	//2.加上后explicit,c2+5会提示没有操作数与+匹配

	//unexplicit one argument (非明确的单一实参函数)
	//只有这种函数才能做隐式转换
	//再解释一下,这里面imag=0,所以只有r1一个实参
	Complex(int r1, int ima1=0) :real(r1), imag(ima1) {};
	Complex operator+(Complex const& c2)
	{
		return Complex(real + c2.real, imag + c2.imag);
	}
	friend ostream& operator<<(ostream& out, const Complex& c);//流运算符的定义不能放类里面,否则会说缺少参数


};	
ostream& operator<<(ostream& out, const Complex& c) 
{
	out << "(" << c.real << "," << c.imag << ")";
	return out;
}
void main()
{
	Complex c1{ 1,2 };
	Complex c2 = c1 + 5;
	/*
	1.正常情况下,这一步运算之所以可以实现,是因为imag默认值为0,所以当+号运算符被重载后
	编译器会自动将5作为Complex类,然后通过+号进行运算,如果想抑制内置类型隐式转换,,在构造函数加上explicit
	*/
	cout << c2 << endl;
}

2 作用

抑制内置类型转换,即上面代码的自动将 5 转换 为 Complex 类
从而实现Complex c2 = c1 + 5;
在构造函数前面加上explicit后,则
Complex c2 = c1 + 5;会报错,从而抑制内置类型转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值