为何本题通不过?

wengzuliang 2003-10-23 09:58:02
//关于无名对象的使用

#include<iostream>

using namespace std;

class X
{
public:
X(int x);
X(X & s);
~X();
};

X::X(int x)
{
cout << "Constructing new X:" << x << endl;
}

X::X(X & s)
{
cout << "Constructing copy of:" << endl;
}

X::~X()
{
cout << "Destructing" << endl;
}

X f(X x)
{
cout << "In function " << endl;
return x;
}

int main()
{
X a(1);
X b=f(X(2)); //这里通不过!
a=f(a);
system("pause");
return 0;
}
...全文
29 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wengzuliang 2003-10-28
  • 打赏
  • 举报
回复
fengfeng2003 分析的极是,多谢大家!
langzi8818 2003-10-24
  • 打赏
  • 举报
回复
程序是通的过,但是要养成一个好的习惯是最重要的
WYC2300 2003-10-23
  • 打赏
  • 举报
回复
谢了

我也半懂了啊 `
因为我还没学完
Jinhao 2003-10-23
  • 打赏
  • 举报
回复
注意,上面那个不是临时对象,个局部对象
fengfeng2003 2003-10-23
  • 打赏
  • 举报
回复
因为X b=f(X(2));
f(X(2))函数返回会产生一个临时对象是const
调用拷贝构造函数赋值给b
而你的拷贝构造函数不是const,而且把缺省的拷贝构造函数覆盖掉了,所以找不到合适的拷贝构造函数
Jinhao 2003-10-23
  • 打赏
  • 举报
回复
楼上说道了问题的关键

X f(X x)改为

X f(const X& x)
fengfeng2003 2003-10-23
  • 打赏
  • 举报
回复
我上面解释有问题
问题在你的拷贝构造函数的参数应该是const
#include <iostream>
#include <cstdlib>
using namespace std;

class X
{
public:
X(int x);
X(const X & s);
~X();
};

X::X(int x)
{
cout << "Constructing new X:" << x << endl;
}

X::X(const X & s)
{
cout << "Constructing copy of:" << endl;
}

X::~X()
{
cout << "Destructing" << endl;
}

X f(X x)
{
cout << "In function " << endl;
return x;
}

int main()
{
X a(1);
X b=f(X(2)); //这里通不过!
a=f(a);
system("pause");
return 0;
}

DEV-C++调试通过
fengfeng2003 2003-10-23
  • 打赏
  • 举报
回复
X b=f(X(2)); //这里通不过

因为X(2)实际构造了一个临时对象,是const
所以参数与f函数的声明是不一致的
同时返回的也是const ,也与声明不一致
kngpm584 2003-10-23
  • 打赏
  • 举报
回复
应该是编译器的问题吧,报错的id是什么?
ipgk 2003-10-23
  • 打赏
  • 举报
回复
我用VC6可以通过啊,没问题。
liersgroom 2003-10-23
  • 打赏
  • 举报
回复
我用VC6.0,可以编译通过啊,一点问题都没有

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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