转换构造函数 引发的二义性
问题是关于转换构造函数的调用,
比如说类 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
不知是不是我理解不到位,,书上说这样的代码有二义性,
不知道问题在那里....










