显式和隐式构造函数
这个问题在这里已经有了答案:
以此为例:
class complexNumbers {
double real, img;
public:
complexNumbers() : real(0), img(0) { }
complexNumbers(const complexNumbers& c) { real = c.real; img = c.img; }
complexNumbers( double r, double i = 0.0) { real = r; img = i; }
friend void display(complexNumbers cx);
};
void display(complexNumbers cx){
cout<<"Real Part: "<<cx.real<<" Imag Part: "<<cx.img<<endl;
}
int main() {
complexNumbers one(1);
display(one);
display(300); //This code compiles just fine and produces the ouput Real Part: 300 Imag Part: 0
return 0;
}
由于方法display
需要类complexNumbers
一个对象/实例作为参数,所以当我们传递一个小数值为300时,就会发生隐式转换。
为了克服这种情况,我们必须强制编译器仅使用显式构造来创建一个对象,如下所示:
explicit complexNumbers( double r, double i = 0.0) { real = r; img = i; } //By Using explicit keyword, we force the compiler to not to do any implicit conversion.
并且在这个constructor
出现在你的类中之后,语句display(300);
会给出错误。