同志们...深更半夜了.进来帮个忙..有关用户自定义转换的问题..

R9R9R9 2005-07-13 02:28:19
class inter
{
public:

inter(int i):_value(i)
{
cout<<"inter(i)"<<endl;
}

inter(const inter &ri):_value(ri._value){cout<<"inter(const inter &)"<<endl;}
private:
int _value;
};

void clac(inter)
{
cout<<"clac(int) "<<endl;
}
int main()
{
int a;
clac(a); //
system("pause");
return 0;
}

在C++ PRIMER中写道:
clac(a)的C++伪码如下:
{
inter temp=inter(a); //那么这里temp的拷贝构造函数的调用怎么没有显示出来..
calc(temp); //这里也应该有一拷贝构造函数的调用也没有显示出来..??
}

-------------------
DEV-C++ 编译


...全文
155 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
foochow 2005-07-13
  • 打赏
  • 举报
回复
VC6.0正常显示
...................
#include<iostream>
using namespace std;
class inter
{
public:

inter(int i):_value(i)
{
cout<<"inter(i)"<<endl;
}

inter(const inter &ri):_value(ri._value){cout<<"inter(const inter &)"<<endl;}
private:
int _value;
};
void clac(inter)
{
cout<<"clac(int) "<<endl;
}
void clac(int a)
{
inter temp=inter(a);
clac(temp);
}
int main()
{
int a=10;
clac(a); //
system("pause");
return 0;
}
显示:
inter(i) ---->inter(a)
inter(const inter &)------>inter temp=inter(a);
inter(const inter &)------>clac(temp);
clac(int)
R9R9R9 2005-07-13
  • 打赏
  • 举报
回复
to:andy_bin(乐逍遥)

lac(a)的C++伪码如下:
{
inter temp=inter(a); //这里inter(a)调用了一个构造函数..显示了inter(i);那然后inter temp用这个对像初始化.应该调用了一个拷贝构造函数..这个为什么没有显示出来
calc(temp); //这里的calc(inter)参数是传值调用.也应该有一个拷贝构造函数的调用.怎么也没有显示出来...哪里有不对的请指正...
}
andy_bin 2005-07-13
  • 打赏
  • 举报
回复
是这样么?

cale(a)
{
inter temp=inter(a) //int a通过调用构造函数inter(int i):_value(i)构造一临时的inter
//对象temp.显示结果为 "inter(i);"
calc(temp); //用该临时对象调用calc(inter) 输出为"calc(int)";temp 就是
//calc(inter)的参数。
//这里不必再调用构造函数了吧!所以不会有什么输出的吧!
}
R9R9R9 2005-07-13
  • 打赏
  • 举报
回复
结果如下:
inter(i)
clac(int)
但是
clac(a)的C++伪码如下:
{
inter temp=inter(a); //那么这里temp的拷贝构造函数的调用怎么没有显示出来..
calc(temp); //这里也应该有一拷贝构造函数的调用也没有显示出来..??
}

两个拷贝构造函数的调用呢.怎么没有显示呢?
the777 2005-07-13
  • 打赏
  • 举报
回复
VC6:sp6 下正常显示!
zhouhuahai 2005-07-13
  • 打赏
  • 举报
回复
不知楼主的版本是否过低,我用VC6和dev-c++都通过了,没问题.
正常显示出
inter(i)
OpenHero 2005-07-13
  • 打赏
  • 举报
回复
mark
学习一下
R9R9R9 2005-07-13
  • 打赏
  • 举报
回复
嗯...有同志说是编译器的优化...

这代码在c++ primer的640页...用构造函数作为转换函数...结贴了
andy_bin 2005-07-13
  • 打赏
  • 举报
回复
calc(inter)函数需要一个inter型的对象,但是传递过来的是一个int型!所以编译器会尝试隐式的类型转换。通过构造函数inter(int i):_value(i)将int a 转化为inter型对象 temp;直接作为calc(inter)的参数!所以不存在你所说得那些拷贝构造!

clac(a)的C++伪码如下:
{
inter temp=inter(a); //那么这里temp的拷贝构造函数的调用怎么没有显示出来..
calc(temp); //这里也应该有一拷贝构造函数的调用也没有显示出来..??
}

也许作者只是为了使逻辑更加易懂,所以写了两行。其实两个temp就是一个temp.没有必要再拷贝构造吧!

个人觉得这样
calc(int a)
{
calc(inter(a));
}

对不起,我不知道书上具体是怎么讲的,但是从程序运行的结果来看,个人觉得是这样啦!
如果不对,请大家多多指正!
^_^...
R9R9R9 2005-07-13
  • 打赏
  • 举报
回复
TO:foochow(恰似你的温柔)

书中写明clac(a)的C++伪码如下:
{
inter temp=inter(a); //那么这里temp的拷贝构造函数的调用怎么没有显示出来..
calc(temp); //这里也应该有一拷贝构造函数的调用也没有显示出来..??
}

这只是伪码啊..实际我们只是调用了
void clac(inter)
{
cout<<"clac(int) "<<endl;
}

这个函数..并没有调用了其他的东西..按理说.正常的显示应该像你上面写的那样吧..

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧