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

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++ 编译


...全文
185 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;
}

这个函数..并没有调用了其他的东西..按理说.正常的显示应该像你上面写的那样吧..
内容概要:本文档为一份《计算机程序设计语言(C++)》课程的实验报告,涵盖了从基础语法到面向对象编程的多个实验内容。实验内容包括基础语法练习(如银行存款计算、数值比较、科学计算)、控制结构(分支与循环,如闰年判断、素数判定、Kaprekar黑洞数)、数组操作(一维与二维数组的排序、查找、极值计算、杨辉三角)、函数定义与应用(递归、参数传递、函数重载)以及面向对象编程(类与对象的设计、继承、多态性、文件操作)。文档详细展示了每个实验的任务描述、具体C++代码实现、测试结果及实验分析,体现了从简单到复杂、逐步深入的学习路径。; 适合人群:具备C++基础语法知识,正在学习或巩固程序设计课程的在校大学生及初级编程学习者。; 使用场景及目标:①作为C++课程的配套实验指导材料,帮助学生通过实践掌握编程基础知识和核心算法;②用于自学练习,提升对循环、数组、函数和面向对象等核心概念的理解与编码能力。; 阅读建议:学习者应结合文档中的代码实例,动手在编程环境中逐一实现并调试,重点关注代码逻辑、边界条件处理和算法效率,通过对比预期输出与实际输出加深对知识点的掌握。

65,210

社区成员

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

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