| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1917 人关注过本帖, 1 人收藏
标题:转换构造函数 引发的二义性
取消只看楼主 加入收藏
hzz063
Rank: 3Rank: 3
来 自:横县百合
等 级:论坛游侠
帖 子:80
专家分:114
注 册:2010-1-27
结帖率:100%
收藏(1)
 问题点数:0 回复次数:3 
转换构造函数 引发的二义性


问题是关于转换构造函数的调用,
比如说类 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

不知是不是我理解不到位,,书上说这样的代码有二义性,
不知道问题在那里....

搜索更多相关主题的帖子: 函数 构造 
2010-07-15 11:36
hzz063
Rank: 3Rank: 3
来 自:横县百合
等 级:论坛游侠
帖 子:80
专家分:114
注 册:2010-1-27
收藏
得分:0 
恩,我看了代码.还是不怎么理解...
说第一个问题,,
程序代码:
#include <iostream.h>


class date
{
public:
       
    date(int a, int b);
    date(int a);                              
    friend date operator+( date &a,  date &b); //这里用引用的话,编译出错,如果改为 friend date operator+( date a,  date b);
    void output(void);                        // 不用引用,可以通过。
private:
    int i;
    int j;
};

/*  */
date::date(int a, int b)
{
    i = a; j = b;
}

date::date(int a)
{
    i = a; j = 0;
}

date operator+(date &a, date &b)
{
    return date(a.i + b.i, a.j + b.j);
}


void date::output(void)
{
    cout << i << "  " << j << endl;
    return;
}


int main(void)
{

    date da(100, 200);
    date c(0,0);
    c = 10 + da;

    c.output();

    return 0;
}
这两种写法怎么理解呀,,

一切只因为喜欢。
2010-07-15 20:47
hzz063
Rank: 3Rank: 3
来 自:横县百合
等 级:论坛游侠
帖 子:80
专家分:114
注 册:2010-1-27
收藏
得分:0 
非常非常感谢你!!!
这里:
   
 //fun(10);  报错.按引用传递就是对参数直接操作。所以将10传给一个非const型是通不过的
我明白了...10是常量,如果改成变量 n 没问题。
但....也许我脑袋实在时不行...
但这与上一个例子有什么共同之处?
friend date operator+( date &a,  date &b);
如果是“因为常量(10)的引用无法赋给非const型的引用做形参。”的话,
那么把 10 放入变量 n 中,然后再  c = n + da; 应该来说来是可以过呀,
但实际还是不能。

E:\练习文件\【C++】\练习2.cpp(47) : error C2678: binary '+' : no operator defined which takes a left-hand operand of type 'int' (or there is no acceptable conversion)
执行 cl.exe 时出错.

实在时麻烦你了.....

一切只因为喜欢。
2010-07-16 20:20
hzz063
Rank: 3Rank: 3
来 自:横县百合
等 级:论坛游侠
帖 子:80
专家分:114
注 册:2010-1-27
收藏
得分:0 
回复 6楼 lintaoyn
恩,说到点上了…隐式转换不会被用于非const的引用参数。

一切只因为喜欢。
2010-07-17 08:55
快速回复:转换构造函数 引发的二义性
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018650 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved