c++自定義輸出格式

按照要求格式輸出常用方法有兩種

問題:按如下格式輸出時間
YY:MM:SS


第一種方法:重載流操作符<< ,代碼如下
  • Time.h頭文件
//Time.h頭文件
#ifndef TIME_H_INCLUDED
#define TIME_H_INCLUDED

using namespace std;//必須要加
class Time
{
private:
    int second;//秒
    int minute;//分
    int hour;//時
public:
    Time();
    Time(int h,int m,int s);
    friend Time & operator++(Time &time);//返回值是一個對象,加個引用比較好
    friend ostream & operator<<(ostream & out,Time & time);//這裏把重載的<<方法聲明爲友元函數是因爲該方法需要訪問Time類的私有屬性
};

/*而且需要寫成傳入自身參數形式,因爲這是友元函數重載一元運算符,不是成員函數方式重載的,
成員函數這裏就不用了傳入參數,本身有this指針

如果是二元運算符用友元函數重載二院運算符的話,則需要寫成傳入兩個參數的形式
成員函數重載二院運算符時就只需要傳入一個參數就行,另一個是本身的this指針

*/




#endif // TIME_H_INCLUDED
  • Time.cpp具體實現
//Time.cpp具體實現類
#include <iostream>
#include <string>
#include "Time.h"


//必須使用c++2011版本編譯器才能使用string的相關操作
using namespace std;


Time::Time()
    {
        this->second = 0;
        this->minute = 0;
        this->hour = 0;
    }

Time::Time(int h,int m,int s)//需要加Time::
{
    second = s;
    minute = m;
    hour = h;
}

Time & operator++(Time &time)//因爲他不是成員函數,所以不要使用Time::(類名加作用域解析操作符)限定符。另外不要再定義中使用friend關鍵字
{
    time.second += 1;//秒
    time.minute = time.minute + time.second/60;//分
    time.hour = time.hour + time.minute/60;//時
    if(time.second==60)
    {
        time.second = 0;//重置秒數
    }
    if(time.minute==60)
    {
        time.minute = 0;//重置分數
    }
    if(time.hour==24)//重置時
    {
        time.hour = 0;
    }


    return time;

}

//重載流操作符<< 實現自定義格式輸出,另一種tostring方法見自己CSDN博客
ostream & operator<<(ostream & out,Time & time)
{
    out << time.hour << ":" << time.minute << ":" << time.second;
    return out;
}
  • main.cpp主函數調用
//main.cpp主函數調用
#include <iostream>
#include "Time.h"
using namespace std;

int main()
{
    Time t1;
    Time t2(22,59,59);
    cout << ++t2 << endl;
    return 0;
}

運行結果:
在這裏插入圖片描述


第二種方法:利用c++2011新標準(2011年以後的都支持如果是codeblocks需要選擇編譯器版本見 https://blog.csdn.net/lereno/article/details/90266505)直接把要求格式tostring,再直接輸出,代碼如下:
  • Time.h頭文件
//Time.h頭文件
#ifndef TIME_H_INCLUDED
#define TIME_H_INCLUDED

using namespace std;//必須要加
class Time
{
private:
    int second;//秒
    int minute;//分
    int hour;//時
public:
    Time();
    Time(int h,int m,int s);
    friend string operator++(Time &time);//返回值是一個對象,加個引用比較好,
};

/*而且需要寫成傳入自身參數形式,因爲這是友元函數重載一元運算符,不是成員函數方式重載的,
成員函數這裏就不用了傳入參數,本身有this指針

如果是二元運算符用友元函數重載二院運算符的話,則需要寫成傳入兩個參數的形式
成員函數重載二院運算符時就只需要傳入一個參數就行,另一個是本身的this指針

*/




#endif // TIME_H_INCLUDED
  • Time.cpp具體實現類
//Time.cpp具體實現類
#include <iostream>
#include <string>
#include "Time.h"


//必須使用c++2011版本編譯器才能使用string的相關操作
using namespace std;


Time::Time()
    {
        this->second = 0;
        this->minute = 0;
        this->hour = 0;
    }

Time::Time(int h,int m,int s)//需要加Time::
{
    second = s;
    minute = m;
    hour = h;
}

string operator++(Time &time)//因爲他不是成員函數,所以不要使用Time::(類名加作用域解析操作符)限定符。另外不要再定義中使用friend關鍵字
{
    time.second += 1;//秒
    time.minute = time.minute + time.second/60;//分
    time.hour = time.hour + time.minute/60;//時
    if(time.second==60)
    {
        time.second = 0;//重置秒數
    }
    if(time.minute==60)
    {
        time.minute = 0;//重置分數
    }
    if(time.hour==24)//重置時
    {
        time.hour = 0;
    }
    string str = std::to_string(time.hour)  + ":" + std::to_string(time.minute) + ":" + std::to_string(time.second);

    return str;//也可以直接返回一個Time對象就是

}
  • main.cpp主函數調用
//main.cpp主函數調用
#include <iostream>
#include "Time.h"
using namespace std;

int main()
{
    Time t1;
    Time t2(22,59,59);
    cout << ++t2 << endl;
    return 0;
}

運行結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章