为什么会编译报错呢?
下面的代码中
B(& k)这个构造函数为甚么只能按引用方式来传递对象参数,而用按值的方式却编译报错??
[code=C/C++][/code]
#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;
}
[解决办法]
你那个定义的是copy construct函数,按值的话传参数也要调用自己,那就是无限递归
[解决办法]
#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成功通过
[解决办法]
因为B的定义内部不能定义B类型的变量,因为编译器这时候找不到B的完整定义,但B类型的引用或者指针就可以
[解决办法]
按值传递的话,需要知道B类型的大小。B类型的定义不确定,就无法判断B类型的大小,而传递指针和引用就不需要知道B类型的大小。
[解决办法]
因为此时类型B还是个不完整的类型,如果定义对象而不是引用的话,需要知道B类型的大小,现在B是个不完整的类型,无法知道其大小,就只能使用引用或指针,而指针或引用不需要知道其大小