一道面试题目的疑问?

yisea123 2007-09-28 11:51:40
#include <iostream.h>
class B
{
private:
int data;
public:
B()
{
cout<<"default constructor"<<endl;
}
~B()
{
cout<<"destructed"<<endl;
}
B(int i):data(i)
{
cout<<"constructed by parameter" << data <<endl;
}

};

B Play( B b)
{
return b ;
}

int main(int argc, char* argv[])
{
B temp = Play(5);
return 0;
}

问题:
1.该程序输出的结果是什么?为什么会有这样的输出?
2.B(int i):data(i)这种用法专业术语叫什么?
3.Play(5),形参类型是类,而5是个常量,这样写合法吗?为什么?
...全文
448 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuwja 2008-08-21
  • 打赏
  • 举报
回复
同意
adamzhang83 2007-09-28
  • 打赏
  • 举报
回复
May be this is a good choice. Thank you !
geez 2007-09-28
  • 打赏
  • 举报
回复
1. 应该有两个"destructed"输出
constructed by parameter5 //在Play(5)处, 5通过隐含的类型转换调用了B::B(int i)
destructed //Play(5)返回时,参数的析构函数被调用
destructed //temp的析构函数调用;temp的构造函数调用的是编译器生成的拷贝构造函数
2. 带参数的构造函数,冒号后面是成员变量初始化列表(member initialization list)
3. 合法。单个参数的构造函数如果不添加explicit关键字,会定义一个隐含的类型转换(从参数的类型转换到自己);添加explicit关键字会消除这种隐含转换。
CoffeeCN 2007-09-28
  • 打赏
  • 举报
回复
1. constructed by parameter5
destructed

Play( B b) => 形参调用重载的构造函数
B temp = Play(5) => 调用默认的拷贝构造函数,把形参的对象拷贝到temp里面

2. 重载构造函数

3. 合法,编译器找到一个匹配的构造函数,形参调用该的构造函数,并且实例化一个B类
look01 2007-09-28
  • 打赏
  • 举报
回复
楼上说的没错,今天看了上午了,全都是这种基础的问题,汗啊,
yisea123 2007-09-28
  • 打赏
  • 举报
回复
我运行了

但我想知道为什么
ckt 2007-09-28
  • 打赏
  • 举报
回复
//一次把5转换成B的对象执行Play函数
//优化后,直接调用拷贝构造函数生成temp

//构造函数初始化表

//这里合法,编译器会调用转换构造函数,把5转换成类对象
taodm 2007-09-28
  • 打赏
  • 举报
回复
你自己编译运行一下就知道1/3的答案了。
2叫初始化列表。建议你买本《C++ Primer》补补基础知识
「已注销」 2007-09-28
  • 打赏
  • 举报
回复
输出结果咱就不说了,大家都会测试.
对于2和3

2.这是成员函数初始化列表(你可以在百度上搜一下这个列表的作用,应该有的)
  eg:
  调用基类构造函数;
  初始化该类的const成员
  ....
  ....

3.5是个常量,它作为实参时,被隐式转换了一下,B temp = <dynamic_cast>(5);
这样它就就是合法的,关于这个 建议你看下More Effective C++ 里面讲的很好.
zyx040404 2007-09-28
  • 打赏
  • 举报
回复
geez是对的
懒得打字 2007-09-28
  • 打赏
  • 举报
回复
都是基础的问题,楼上都说了
不过第二个好像应该是:参数初始化表对数据成员初始化(<C++程序设计>谭浩强2004 p267)

64,633

社区成员

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

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