1 测试代码部分
- 将代码拷贝到自己的工程中
- 运行后发现可以实现 Complex c2 = c1 + 5; 正常来说,5不是一个Complex,为何可以通过操作符重载实现相加呢
(正常情况下,这一步运算之所以可以实现,是因为imag默认值为0,所以当+号运算符被重载后
编译器会自动将5转换为Complex类,然后通过+号进行运算)
- 在构造函数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;会报错,从而抑制内置类型转换