嗯......首先是重载的时候老是遇到的输入和输出流....
和主题没有什么关系,但是多写几次加深记忆,最近老是忘记,用的不熟练,老是错...
首先是输出流:
friend ostream & operator << ( ostream & os,const X & t);//类的内部的书写形式
ostream & operator << (ostream & os,const X & t)//类的外部单独写的
{
os<<...
return os;
}
然后是输入流:
friend istream & operator >> (istream & is,X & t)
istream & operator >> (istream &is,X & t)
{
//我的方法是,首先搞清楚输入的是什么数据,然后定义相关的几个数据类型的数据,
//然后依次输入,最后传入一个set函数里面,如下;
string ss;
int temp;
is>>s>>temp;
t.set(ss,temp);
return is;
}
当然也可以
friend istream & operator >> (istream & is,X & t)
istream & operator >> (istream &is,X & t)
{
is>>t.a>>t.b...
return is;
}
这样更加简单
呃....这个地方想起来了老师今天说的,friend这个标志写在类的里面就可以了,在外面定义的话是不用写的,然后的话,其实友元函数呢,友元函数和类的成员函数都可以访问类的私有成员变量或者是成员函数,但是他们调用的形式不同。
类的成员函数是属于类的,所以调用的时候是通过指针this调用的。
而类的友元函数不属于类,当然也不能有this指针了,也就是在友元函数中不能出现this指针。
然后就是关于++的前置和后置的问题了,前段时间写过这样的一个题目,但是老是觉得写的不够好,只是把自己的代码发了上去,并没有好好而认真的总结,所以现在来巩固一下,稍加总结:
首先,
++这个操作又前增量和后增量之分,虽然结果一样,但是使用的过程中的差别应该在参数类型或者个数或者次序上的不同也显示出来
首先我们来看一个例子:
#include<iostream>
using namespace std;
int main()
{
int a=1,b=1,c=1,d=1;
(++a)++;//结果为3
(b++)++;//结果为2
++(++c);//结果为3
++(d++);//结果为2
cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;
return 0;
}
首先这个的话,现在的程序已经不能跑出来了,基本都是报错,然后请教了别人再加上分析过后的出来的结果:
首先最特殊的怕是第二个和第四个的匪夷所思的结果了,这里说说不同:
前增量操作的结果与变量值是一致的,而且操作的结果是左值,可以连贯,
而后增量操作的结果是增量之前的变量值,是临时变量,当表达式的计算工作完成的时候,这个临时变量随即就会消失,
所以最终的结果值是会错位的。
所以前增量操作数和返回值是同一个变量,在反应对象的前增量的操作的时候,要求参数为对象引用,返回的还是这个对象参数的引用
而后增量操作数实参会发生变化,但是参数仍然是对象的引用,返回的是临时对象,所以为非引用的对象值;
因为两个操作符的声明参数相同,所以调用的时候无法区分,编译会报错,所以稍加处理,实际上后面的一个参数没有用
代码如下:
//前增量操作的重载
X & operator ++ (X & t);
++t;
//后增量
X operator ++ (X & t,int b)//这个地方的b可以缺省
t++;
不过写到了这里我想起来我前面用的一个方法是用this指针来写的,我对于this指针的用法不是很熟练,然后就是new和delete的用法也不太行,还有一个问题,就是我在写重载的时候,什么时候用&,什么时候要加const?
这三个问题过几次写博客来专门解决。
第二个问题代码如下
//第一个
Time & operator ++ (Time & t)
//第二个
Time operator ++ (Time & t)
//什么时候要引用要加&?