好久没看书了,还是觉得基础很重要。之前,看到“眼熟”的概念或知识,总觉得自己会,却不知道那只是“以为”和“感觉”,即使说“会”。也只是知道点点皮毛,根本不知道所谓。直到跑出去面试,才发现其实面试的东西都是基础,很多时候,很多场面,很多知识,也只有自己真正身临其境的时候才能真正体现自己所学,所感,所悟。就是因为平时总是以“以为”和“感觉”来评判自己,才会造就什么都知道,却什么也不精的悲剧,最近想了很多,这种情况的根源在于自己平时说的太少,悟的太少,真正说出口的更少(即交流的太少),我觉得要想进步,还是得彻底改变自己的学习方式,可以把自己对书上知识的理解写成自己的话,可以以博文形式,可以和别人交流,更有甚者-----自言自语。我觉得我还是选择前者比较好(好过自言自语哈),一点点来,慢慢进步。相信!
Code:
#include "iostream.h"
class CTime{
private:
int hour;
int minute;
int second;
public:
CTime(){}
CTime(int x,int y,int z):hour(x),minute(y),second(z){}
CTime(CTime &Temp):hour(Temp.hour),minute(Temp.minute),second(Temp.second){}
CTime& operator++();
CTime operator++(int);
friend ostream & operator<<(ostream &out,CTime CC);
};
//以成员函数方式重载前置++
CTime& CTime::operator++(){
if(++second>=60){
second-=60;
minute++;
if(minute>=60){
minute-=60;
hour++;
}
}
return *this;
}
//以成员函数方式重载后置++
CTime CTime::operator++(int){
CTime CC(*this);
if(++second>=60){
second-=60;
minute++;
if(minute>=60){
minute-=60;
hour++;
}
}
return CC;
}
ostream & operator<<(ostream &out,CTime CC){
return out<<CC.hour<<":"<<CC.minute<<":"<<CC.second<<endl;
}
int main(int argc,char *argv[]){
CTime C(8,59,56);
CTime D(C);
cout<<++C;
return 0;
}
这个程序很简单,那些基本的重载不想写进去(也没必要),这里第一问题是拷贝构造函数那里得注意,参数必须得是引用,若不用引用由会出错.原因:会陷入不断的构造中.即无限递归,
第二问题,前置++和后置++的区别,看到这里重载的实现,便能更清楚的了解平时的操作结果,前置++返回的是引用类型,说明其可以连续引用,即作为左值,而后置++只是返回一个临时变量,只能以一个右值形式出现,重载输出也一样。
第三个问题便是成员函数和友元函数的区别,为什么有些为成员函数,有些为友元(而且还必须是),一般而言,重载运算符都可申明为友元函数,成员函数一般可以省略第一个参数(该参数是类类型),友元函数却不能省略。而当第一个参数不是类类型时,就像上面的operator<<函数一样。它的第一参数就是流类型,它不能以out.operator<<(CTime & CC)正确表达,为了访问类成员函数,故其必须申明为友元。