44203


  1. `//???`の部分はコンストラクタですか？コピーコンストラクタですか？教えていただきたいです。
  2. また、前の日と次の日を「void operator++();//次の日」、「void operator--();//前の日」で実装しようとすると`//???`の部分はどうしたらわかりやすいコードを書くことが出来るか教えていただきたいです。

[code]

    #pragma once
    #ifndef ___IntArray
    #define ___IntArray
    #include <iostream>
    #include <ostream>
    #include <sstream>
    #include <time.h>
    using namespace std;
    
    #define LEAP 29
    #define NOT_LEAP 28
    
    class Date {
    private:        //うるう年は29           そうじゃない場合は28
                    /* 0  1  2  3  4  5  6  7  8  9 10 11 12*/
        int mon[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    
        int year;
        int month;
        int day;
    public:
    
        Date()//デフォルトコンストラクタ
        {
            /*現在時刻で初期化*/
            time_t timer;
            struct tm local_time;
            timer = time(NULL);
            localtime_s(&local_time, &timer);
    
            year = local_time.tm_year + 100;
            month = local_time.tm_mon + 1;
            day = local_time.tm_yday;
        }
    
        Date(int y, int m, int d)//？？？
        {
            year = y;
            month = m;
            day = d;
    
            /*月が12以上の時１２月３１日に変更*/
            if (month > 12)
            {
                month = 12;
                day = 31;
            }
    
            /*日数がその月の最大日数を超えてる時にうるう年の２月でうるう年かどうかを判定して数字を代入*/
            if (day > mon[month] && month == 2) {
                if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
                {
                    day = LEAP;
                }
                else
                {
                    day = NOT_LEAP;
                }
            }
            else 
            {   
                if (day > mon[month]) {
                    day = mon[month];//2月じゃないけど日数が超えてる場合にその月の最大日数を代入
                }
            }
        }
    
        string to_string()const
        {
            ostringstream s;
            s << year<<"/" << month << "/" << day<<"\n";
            return s.str();
        }
    };
    
    inline ostream& operator<<(ostream& s, const Date& x)
    {
        return s << x.to_string();
    }
    
[/code]


CC BY-SA 4.0
2018-05-23T12:34:07.923
44191
2018-05-24T02:07:50.953
2018-05-23T15:48:02.133
3060
question
c++
クラス作成で名称の意味が混乱しています


1.については、複数の引数を持つ一般的なコンストラクタです。  
コンストラクタは、クラス名と同じ名称で戻り値が無いので判別できます。  
おおざっぱに言うと、  
(A)引数を持たないものはデフォルトコントラクタ。  
(B)自身の型を一つだけ引数に持つものをコピーコンストラクタと言います。  
(C)引数の型や数が異なる複数のコンストラクタを実装できます。  
コンストラクタは他の関数とは異なり、もっと色々な特別扱いが沢山ありますのでご自身でお調べになってみてはどうでしょう。

次に、演算子のオーバーロードは高度な知識が必要な実装なので、一足飛びに挑戦しない方が無難です。  
まずは同等機能を持つ一般メンバ関数として実装してみてはどうでしょう。  
つまり、My_Decriment()関数やMy_Increment()関数などを実装してみるわけです。  
これらが確実に動作することを確認したら対象演算子をオーバーロードして、同じ処理を実装します。  
また、単項後置デクリメント演算子は自身の参照を戻すのが普通です。  
そうでないと、コードによっては希望した動作とならない場合があります。

最後に、クラス名に一般名詞を採用するのは他の実装とぶつかる確率が高くなり危険です。  
意味を保ちつつなるべくユニークに命名すれば本筋でない問題の発生を避けることができ、学習が捗ると考えられます。


CC BY-SA 4.0
2018-05-24T02:07:50.953
44203
2018-05-24T02:07:50.953
3793
44191
answer