读书人

一道面试题目的疑问?解决方案

发布时间: 2012-02-24 16:30:39 作者: rapoo

一道面试题目的疑问?
#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是个常量,这样写合法吗?为什么?


[解决办法]
//一次把5转换成B的对象执行Play函数
//优化后,直接调用拷贝构造函数生成temp

//构造函数初始化表

//这里合法,编译器会调用转换构造函数,把5转换成类对象
[解决办法]
1. constructed by parameter5
destructed

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

2. 重载构造函数

3. 合法,编译器找到一个匹配的构造函数,形参调用该的构造函数,并且实例化一个B类
[解决办法]
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关键字会消除这种隐含转换。
[解决办法]
都是基础的问题,楼上都说了
不过第二个好像应该是:参数初始化表对数据成员初始化( <C++程序设计> 谭浩强2004 p267)
[解决办法]
geez是对的
[解决办法]
输出结果咱就不说了,大家都会测试.
对于2和3

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

3.5是个常量,它作为实参时,被隐式转换了一下,B temp = <dynamic_cast>(5);
这样它就就是合法的,关于这个 建议你看下More Effective C++ 里面讲的很好.

读书人网 >C++

热点推荐