为什么会编译报错呢?

sq20121989 2012-03-11 11:07:27
下面的代码中
B(& k)这个构造函数为甚么只能按引用方式来传递对象参数,而用按值的方式却编译报错??


#include<iostream>
using namespace std;
class A
{
public:
A()
{

}
A(int aa)
{
a=aa;
}
private:
int a;
};

class B
{
public:
B()
{
a=0;
b=0;
c=0;
}
B(int aa,int bb) : a(aa),b(bb),c(aa-bb)
{

}


B(B &k)
{
a=k.a;
b=k.b;
c=k.a-k.b;
}



void printf()
{
cout<<a<<""<<b<<""<<c<<""<<endl;
}
private:
int a;
int b;
int c;
A d;
};


int main()
{
B a,b(1,2);
B x=a,y(b),z(2,1);
a.printf();
b.printf();
x.printf();
y.printf();
z.printf();
return 0;
}
...全文
91 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
oniisama 2012-03-11
  • 打赏
  • 举报
回复
因为B的定义内部不能定义B类型的变量,因为编译器这时候找不到B的完整定义,但B类型的引用或者指针就可以
李荣强 2012-03-11
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;
class A
{
public:
A()
{
}
A(int aa)
{
a=aa;
}
private:
int a;
};
class B
{
public:
B()
{
a=0;
b=0;
c=0;
}
B(int aa,int bb) : a(aa),b(bb),c(aa-bb)
{

}

B(B &k)
{
a=k.a;
b=k.b;
c=k.a-k.b;
}
void printf()
{
cout<<a<<" "<<b<<" "<<c<<" "<<endl;
}
private:
int a;
int b;
int c;
A d;
};
int main()
{
B a,b(1,2);
B x=a,y(b),z(2,1);
a.printf();
b.printf();
x.printf();
y.printf();
z.printf();
return 0;
}这个代码没问题啊,是你的编译器有问题吧我vs2008成功通过


PunWinger 2012-03-11
  • 打赏
  • 举报
回复
你那个定义的是copy construct函数,按值的话传参数也要调用自己,那就是无限递归
  • 打赏
  • 举报
回复
因为此时类型B还是个不完整的类型,如果定义对象而不是引用的话,需要知道B类型的大小,现在B是个不完整的类型,无法知道其大小,就只能使用引用或指针,而指针或引用不需要知道其大小
oniisama 2012-03-11
  • 打赏
  • 举报
回复
按值传递的话,需要知道B类型的大小。B类型的定义不确定,就无法判断B类型的大小,而传递指针和引用就不需要知道B类型的大小。
sq20121989 2012-03-11
  • 打赏
  • 举报
回复
那为什么按引用方式就不会无限递归??

64,682

社区成员

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

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