请教:调用构造函数问题
- C/C++ code
class B{public:B(){ cout << "constructor" << endl;}~B(){ cout << "deconstructo" << endl;}B(int i) : data(i){ cout << "constructor by parameter " << data;}private:int data;};B Play(B b){return b;}int main(int argc, char *argv[]){B t1 = Play(5); //这里为什么可以传5B t2 = Play(t1);return 0;}[解决办法]
因为 Play 这个方法需要一个 B 对象,B 有一个参数是 int 型的构造函数,隐式地将 int 型 5 转换成了 B 类型的对象。
[解决办法]
- C/C++ code
#include <iostream>using std::cout;using std::endl;class B {public: B() { cout << "constructor" << endl; } ~B() { cout << "deconstructo" << endl; } explicit B(int i) : data(i) { cout << "constructor by parameter " << data; }private: int data;};B Play(B b) { return b;}int main(int argc, char *argv[]) { B t1 = Play(5); //这里为什么可以传5 B t2 = Play(t1); return 0;}
[解决办法]
《C++ Primer》(英文版,第4版) p. 461提到:
A constructor that can be called with a single argument defines an implicit conversion from the parameter type to the class type.
(如果一个类的构造函数只接收一个实参(argument),那么就定义了一个从形参(parameter)数据类型到类的类型的隐式转换。)
详情请参考:
隐式类型转换和explicit关键字的作用