只能重载为友元函数
为什么呢?
分析:
1.cout和<<一起为什么可以完成输出操作呢?
因为cout是ostream类的对象,在ostream类中对“<<”进行了重载。
2.“<<”是双目运算符,即有两个操作数
左侧的操作数是cout,右侧的操作数是我们要输出的内容。
3.为什么还要重载呢?
因为在ostream类中重载后,仅仅当右侧的操作数是基本数据类型时完成输出;但有的时候我们需要输出一个对象,此时我们就要再次重载“<<”,使其可以输出对象。
4.在ostream类中重载
ostream & ostream::operator <<(int q)
{
......
return *this;
}
.
.
.
int i;
cout<
1) 我们可以看到operator <<重载为ostream类的成员函数,调用这个函数的对象就是cout
cout<
ostream&类
2)然后我们还要提到的一点就是:return *this;中此时返回的是一个对象,返回值的类型是引用(ostream &),所以返回的是对象本身。若返回的类型是类(ostream),则返回值之前先要调用一次复制构造函数。返回的是复制的对象。
3)然后呢,我们再看返回值类型ostream&,返回的是一个引用,那引用的作用是什么呢?
int a;
int & b=a;
看图,先定义变量a,给a分配了一块内存,然后定义int & 类型的b,并将a赋值给b,此时b是a的引用,然后a和b都指向内存m。然后呢a和b就相当于是同一个东西,b只是a的另一个叫法(名字)。
4)结合以上两点我们可以知道return *this;返回的值的地址没有发生变化,这样做可以让我们在调用函数之后确保改变或者得到我们想要的那块内存中的值。
5.在我们自定义的类中将“<<”重载为友元函数
class A
{
......
public:
......
friend ostream& operator <<(ostream& c,A& a);
};
ostream& operator <<(ostream& c,A& a)
{
.......
return c;
}
int main()
{
A e,t;
cout<
定义类A,然后定义A类的对象e和t,先cout<
在operator<<这个函数中他有两个形参ostream& c,A& a,形参个数与<<的操作数数目相同,并且左右操作数的类型相对应。
1)return c;为什么返会值是c呢?
先看cout<
6.当运算符重载为成员函数时,其形参参数是操作数数目减一,比如双目运算符,重载为成员函数时只有一个形参(右侧的操作数),那左侧的操作数呢?
class A
{
......
A operator +(A& b);
};
A A::operator +(A& b)
{
return A(*this+b);
}
int main()
{
A a,b,;
A c=a+b;
}
此代码仅帮助理解接下来的一段话,
c=a+b;是将a+b的返回值赋值给c;a+b等价于a.operator+(b);可以看到对象a就是左操作数,a用来调用函数operator+,b(右操作数)作了形参。
在成员函数中,有默认形参*this(当前类的当前对象),也就是调用了当前类的成员函数的对象a,*this作形参必须省略。【所以我们得到一条不能作成员函数的原因:<<的左操作数cout不是当前类的对象,不能使用*this;cout是ostream类的对象,不能直接调用其他类的成员数】
最后小小的提一下return this;返回的是对象的地址。
还有就是,只要创建对象就会分配内存



