关于运算符重载函数编译时的两个问题

edwardrong 2006-03-10 03:27:59
/*
运算符前置++和后置++重载为时钟类的成员函数。
前置单目运算符,重载函数没有形参,对于后置单目运算符,重载函数需要一个整型的形参
操作数是时钟类的对象
实现时间增加1秒钟

*/
#include <iostream.h>
class Clock
{
public:
Clock(int NewH=0,int NewM=0,int NewS=0){Hour=NewH;Minute=NewM;Second=NewS;};
void ShowTime(){cout<<Hour<<":"<<Minute<<":"<<Second<<endl;};
Clock operator ++()//前置单目运算符重载
{ Second++;
if (Second>=60)
{ Second-=60;
Minute++;
if(Minute>=60)
{ Minute-=60;
Hour++;
if (Hour>=24) Hour%=24;
}
}
cout<<"++Clock:"<<endl;
return *this;
}
Clock operator ++(int)//后置单目运算符重载
{
Second++;
if (Second>=60)
{ Second-=60;
Minute++;
if(Minute>=60)
{ Minute-=60;
Hour++;
if (Hour>=24) Hour%=24;
}
}
cout<<"Clock++:";
return *this;
}
private:
int Hour,Minute,Second;
}
/*问题1:
Clock operator::++()//前置单目运算符重载
{ Second++;
if (Second>=60)
{ Second-=60;
Minute++;
if(Minute>=60)
{ Minute-=60;
Hour++;
if (Hour>=24) Hour%=24;
}
}
cout<<"++Clock:"<<endl;
return *this;
}
Clock Clock::operator ++(int)//后置单目运算符重载
{
Second++;
if (Second>=60)
{ Second-=60;
Minute++;
if(Minute>=60)
{ Minute-=60;
Hour++;
if (Hour>=24) Hour%=24;
}
}
cout<<"Clock++:";
return *this;
}
*/
/*问题2
void*/main()
{
Clock myClock(23,59,59);
cout<<"First time output:";
myClock.ShowTime();
myClock++;
myClock.ShowTime();
++myClock;
myClock.ShowTime();
return 1;
}

我这条程序如今是对的,但针对注释那两部分,则有编译时出现了问题:
问题1:当我在类外写运算符重载函数++时,会出现下面结果:

当我在类外声明重载函数时,就会出现以下结果:
E:\homework\C++\code\下\eg8-2单目运算符函数成员的设计.cpp(20) : error C2589: '++' : illegal token on right side of '::'
E:\homework\C++\code\下\eg8-2单目运算符函数成员的设计.cpp(20) : error C2143: syntax error : missing ';' before '::'
E:\homework\C++\code\下\eg8-2单目运算符函数成员的设计.cpp(20) : fatal error C1004: unexpected end of file found

我百思不得其解,只有把它的定义写进类内。

问题2 :
当我在main前加上void ,就出现下面结果:
E:\homework\C++\code\下\eg8-2单目运算符函数成员的设计.cpp(77) : error C2628: 'Clock' followed by 'void' is illegal (did you forget a ';'?)
Error executing cl.exe.
...全文
94 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaocai0001 2006-03-10
  • 打赏
  • 举报
回复
这样说吧

对于build-in数据类型
如int i;

++i = 5;这样写是允许的, 如果返回的是临时对象, 会出现什么结果?
逸学堂 2006-03-10
  • 打赏
  • 举报
回复
想不到……加上&有什么好?
`~`~`~`~`~`~
&是返回++后对象的一个引用,不加&是返回一个对象(应该说是临时对象)
后者需要创建一个clock对象,然后在析构,造成效率下降,前者不会.
edwardrong 2006-03-10
  • 打赏
  • 举报
回复
想不到……加上&有什么好?
xiaocai0001 2006-03-10
  • 打赏
  • 举报
回复
你自己想想返回值是加上&好呢还是不加&好.
edwardrong 2006-03-10
  • 打赏
  • 举报
回复
谢了,原来就是因为
class Clock
{
......
};
不小心删掉了分号,现在一切都可以了

但是,不是改成Clock & Clock::operator++()而是改成Clock Clock::operator++()
xiaocai0001 2006-03-10
  • 打赏
  • 举报
回复
在类的声明最后一个花括号后面少了一个分号
类的声明写成这样的
class Clock
{
......
}; // <------注意这儿的分号!
xiaocai0001 2006-03-10
  • 打赏
  • 举报
回复
Clock operator::++()//前置单目运算符重载
----------
怎么写成这样了啊

应该是
Clock & Clock::operator++()//前置单目运算符重载

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧