函数参数类型隐式转换规则

weixin_41761117 2018-02-28 02:43:18
#include <iostream>
#include <string.h>
using namespace std;
class B
{
public:
B()
{
cout<<"default constructor"<<endl;
}
B(const B &b)
{
cout<<"copy default constructor"<<endl;
data = b.data;
}
B(int i):data(i)
{
cout<<"parameter constructor "<<data<<endl;
}
~B()
{
cout<<"deconstructor "<<endl;
}
private:
int data;
};

B play(B b)
{
return b;
};

int main()
{
B t1 = play(5);
B t2 = play(t1);

}

这段代码运行结果
parameter constructor 5
copy default constructor
deconstructor
copy default constructor
copy default constructor
deconstructor
deconstructor
deconstructor
我好奇的是,
为什么play(5)能够执行成功,其定义的形参类型明明是B,按我的理解应该报编译错误
...全文
272 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_41761117 2018-02-28
  • 打赏
  • 举报
回复
引用 1 楼 jianwen0529 的回复:
B(int i):data(i) { cout<<"parameter constructor "<<data<<endl; } 有这么一个构造函数,接受一个int参数。 对于接受一个参数并且没有explicit修饰的构造函数,包含隐式转换的功能!即你代码中的5被构造成B的一个对象
确实是,添加explicit后编译就报错了
幻夢之葉 2018-02-28
  • 打赏
  • 举报
回复
B(int i):data(i) { cout<<"parameter constructor "<<data<<endl; } 有这么一个构造函数,接受一个int参数。 对于接受一个参数并且没有explicit修饰的构造函数,包含隐式转换的功能!即你代码中的5被构造成B的一个对象

64,639

社区成员

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

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