#include
using namespace std;
class Clock
{
int hour, minute, seconds;
public:
Clock(int hour, int minute, int seconds):hour(hour), minute(minute), seconds(seconds) {}
void ShowTime()
{
cout<<hour<<":"<<minute<<":"<<seconds<<endl;
}
Clock& operator++()
{
if(++seconds == 60)
seconds = 0, ++minute;
if(minute == 60)
minute=0, ++hour;
if(hour == 24)
hour = 0;
return *this;
}
Clock operator++(int)
{
Clock c = *this;
++(*this);
return c;
}
};
int main()
{
Clock myClock(23, 59, 58);
cout << "output:" << endl;
myClock.ShowTime();//23:59:58
myClock++;
myClock.ShowTime();//23:59:59
++myClock;
myClock.ShowTime();//0:0:0
(myClock++).ShowTime();//0:0:0
(++myClock).ShowTime();//0:0:2
}
第一个myClock++显示输出秒加1是不是因为Clock c = *this; 类似浅拷贝啊
(myClock++).ShowTime(); 输出秒为0 这为什么啊?? 求解决
谢谢
没问题啊,myClock++返回的是++之前的clock,这么设计才符合约定。
从代码上看,Clock c = *this;这里C++编译器会先调用拷贝构造函数返回一个新的myClock,再++
为了让你看到这一点,你可以看下面的代码:
#include <iostream>
using namespace std;
class Clock
{
int hour, minute, seconds;
public:
Clock(int hour, int minute, int seconds):hour(hour), minute(minute), seconds(seconds) {}
Clock(Clock &c) //加上
{
hour = 1;
minute = 2;
seconds = 3;
}
void ShowTime()
{
cout<<hour<<":"<<minute<<":"<<seconds<<endl;
}
Clock& operator++()
{
if(++seconds == 60)
seconds = 0, ++minute;
if(minute == 60)
minute=0, ++hour;
if(hour == 24)
hour = 0;
return *this;
}
Clock operator++(int)
{
Clock c = *this;
++(*this);
return c;
}
};
int main()
{
Clock myClock(23, 59, 58);
cout << "output:" << endl;
myClock.ShowTime();//23:59:58
myClock++;
myClock.ShowTime();//23:59:59
++myClock;
myClock.ShowTime();//0:0:0
(myClock++).ShowTime();//0:0:0 //这里输出了1:2:3,说明拷贝构造函数调用了
(++myClock).ShowTime();//0:0:2
}
因此是不是“浅拷贝”完全取决于你怎么写这个拷贝构造函数。你完全可以在里面加上深拷贝的逻辑。
甚至像我那样,返回一个别的什么
如果问题得到解决,麻烦点下我回答右边的采纳,谢谢
前++先加再用,后++先用后加
后++也就是你说的右++,先是myClock.showTime(),然后才myClock++
看下面注释
Clock operator++(int) //这里是重载后++
{
Clock c = *this; //先拷贝自增前的状态
++(*this); //调用前++
return c; //这里实际上得到自增前的对象
}