C++xiao wen ti

来源:百度知道 编辑:UC知道 时间:2024/09/18 05:15:48
#include<iostream.h>
class A
{
private:
int a,b;
public:
A(int x=1,int y=2):a(x),b(y){}
friend A operator +(A , A);
A(int m){a=m,b=0;}
friend ostream & operator <<(ostream & ct,A &dx9)
{ct<<dx9.a<<" "<<dx9.b<<endl;
return ct;}
};
A operator +(A x, A y)
{
return A((x.a+y.a),(x.b+y.b));
}

main()
{
A dx(3,4),dx2,dx3;
dx3=dx+3;
cout<<dx3;
}
把A(int m){a=m,b=0;} 里面改为 int &m就对了 为什么啊?
问题2:我把friend ostream & operator <<(ostream & ct,A &dx9)
的前面两个& 去掉 为什么就不行了? 去掉后就相当于建立一个ct 并把对象cout复制给他,为什么却编译通不过呢?

问题1:
dx3=dx+3;
你定义了+号重载函数,但是2个参数的类型都是(A,A)。
上面这条语句的2个参数类型则分别是(A,int)型。如果你定义了
friend A operator +(A , int);这样的重载函数就会ok。但是这里没有,所以会进行类型转换。将3转换成A类型。就是像下面这样:
dx3=dx+A(3);
单个参数的构造函数具有类型转换的功能。你定义的A(int m);就具有此功能。
但是之所以会出错,是因为还有一个构造函数和它起了冲突:
A(int x=1,int y=2);这个由於给了默认值,所以在将3转换成A类型的时候就不知道调用哪个函数了。如果加上&号,这就不会造成冲突了。如果你的main函数里单单执行这条语句A(3);就会报这样的错误。

问题2:
cout<<a<<b<<c;
cout是具有递归的功效,(((cout<<a)<<b)<<c);
计算过程像这样:
((cout<<a)<<b),c 1

(cout<<a), b 2

cout, a 3
123对应的第一个对象都是同一个的对象。在这个标准输出中陆续输出abc,要保证在每次递归的过程中输出对象是唯一不变的。当然只有引用(指针)可以做到。