转换构造函数 引发的二义性
问题是关于转换构造函数的调用,
比如说类 complex 中定义了转换构造函数,把 int参数转换成complex类的对象。
complex c1;
complex c2;
有表达式:
c1 = c2 + 10;
书上给我的感觉是说,他会隐式去调用 complex(10)这个转换构造函数,但我在vc6上是
通不过的,当然 c1 = c2 + complex(10)显式调用是可以的。
正因为这样又引出了另一个问题,一个类里面有 构造函数、 类型转换函数、 运算符 + 重载函数。
书上说像这样的代码编译会出错,原因时出现二义性,就是它不懂时调用转换构造函数,把55变成date类对象,
还是调用 类性转换函数,把 da 转换成int类型。
恩,听起来很有道理........
程序代码:
#include <iostream.h> class date { public: date(int a, int b); date(int n); //转换构造函数 operator int(); //类型转换函数 friend date operator+(date &, date &); //重载 + void output(void); private: int str; int mimg; }; /****** 定义 ******/ date::date(int a, int b) //构造函数 { str = a; mimg = b; } date :: date(int n) //转换构造函数 { str = n; mimg = 0; } date::operator int() //类型转换函数 { return str; } date operator +(date &a, date &b) //重载 + { return date(a.str + b.str, a.mimg + b.mimg); } void date::output(void) { cout << str << " " << mimg << endl; return; } ///////////////////////////////////////////// int main(void) { date da(100, 200); date c(0,0); c = 55 + da; c.output(); return 0; }
但问题是,我能编译通过.....
我的理解是: 正是因为它不能 隐式 调用【 转换构造函数】 date(55),所以去调用了【 类型转换函数】 operator int(),把 da 转成int了,
结果变成 c = 55 +100 ,这里就调用【 转换构造函数】
当然最后输出的也是 155 0
不知是不是我理解不到位,,书上说这样的代码有二义性,
不知道问题在那里....