C++ のオーバーロードと判断の知識を整理する
目次
1. bool operator>(const Date& d) const [bool 誘導構造埋め込み比較関数]
二、friend ostream& operator<<(ostream& _cout, const Date& d)
問題は次の日付クラスから来ています
class Date
{
public:
Date(int year = 1900, int month = 1, int day = 1)
: _year(year)
, _month(month)
, _day(day)
{}
bool operator<(const Date& d)const
{
return (_year < d._year) ||
(_year == d._year && _month < d._month) ||
(_year == d._year && _month == d._month && _day < d._day);
}
bool operator>(const Date& d)const
{
return (_year > d._year) ||
(_year == d._year && _month > d._month) ||
(_year == d._year && _month == d._month && _day > d._day);
}
friend ostream& operator<<(ostream& _cout, const Date& d)
{
_cout << d._year << "-" << d._month << "-" << d._day;
return _cout;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date date;
cout<<date<<endl;
}
1. bool operator>(const Date& d) const [bool 誘導構造埋め込み比較関数]
1. コードの全体的な意味
分析のためにコードを傍受できます
bool operator>(const Date& d) const
共通の日付クラスの > オーバーロードは次の形式を持ちます. 観察からわかるように、冒頭で述べた > および < オーバーロードされたコードは、次のコードの派生物にすぎず、本質は変わっていません。
bool operator> (const Date& d) const
{
if (_year > d._year ||
_year == d._year && _month > d._month ||
_year == d._year && _month == d._month && _day > d._day)
return true;
else
return false;
}
2. コード内の 2 つの const の意味
- 最初の const は、参照される Date パラメータが変更されないようにするためのものです。
- 二つ目の const は const メンバ関数ですが、なぜそれが必要なのかは別記事を参照してください。
const メンバー関数https://blog.csdn.net/Captain_ldx/article/details/127334021
二、friend ostream& operator<<(ostream& _cout, const Date& d)
次に、このコードについて説明します
friend ostream& operator<<(ostream& _cout, const Date& d)
1. 関連する基本概念
まず、関連する基本的な概念を知る必要があります
- ostream は outputstream の略で、出力ストリームです。C++ で出力に使用される典型的な出力ストリーム オブジェクトは、共通の cout です。C++ では、ostream オブジェクトをカスタマイズすることはほとんどなく、cout を直接使用することがよくあります。
- ostream の型は通常、<< などの演算子のオーバーロードで表示され、特定のクラスのフレンド関数として表示されます。上記のコードを例にとると、Date クラスのオブジェクトを呼び出すと (val という名前を付けたとします)、cout<<val は、通常 Date のメンバー変数を出力するこの関数を呼び出すことと同じです。
- フレンド 改変されたフレンド機能
- 演算子のオーバーロードされた演算子、オーバーロードされた上記のコード <<
2. 3 つの参照 &
上記の 3 つの ostream& operator<<(ostream& _cout, const Date& date) & の参照
1. 最初の ostream& は、ostream クラス オブジェクトへの参照を返します. cout<<a<<b などの連続操作を実行するには、最初に cout<<a を実行し、操作が完了したら、cout への参照を返します。 、つまり return cout 自体は元の式が cout<<b; となり、連続して書けるように、 cout<<a<<b<<c<<.....
2. 2 番目の ostream& _cout、_cout はランダムな名前です。これは ostream クラスのオブジェクトであり、使用法は cout と同じです。その目的は、<< を介して _cout にデータを渡し、最後に _cout を使用できることです。パラメータ発信として。したがって、出力時に cout<<date (date は date クラスのオブジェクト) を使用し、次に operator<<(_cout,d) を呼び出して d の値を取得し (ここで d は例の日付データです)、最後にcout をパラメーターとして渡します。
コード_cout<<date<<endl;の最初の例では、実際に実行されます。
_cout << d._year << "-" << d._month << "-" << d._day;
return _cout;
上記のコードは、以下に示すコードの派生物であり、違いは個人的なコード スタイルの違いによるものです。具体的な意味は同じです。
cout<<date.year<<'-'<<date.month<<'-' <<date.day;
return cout;
3. 3 番目の const Date& は、主にパラメーターの迅速な入力と終了のためのものです. & を使用しない場合、元のオブジェクトを直接渡す代わりにパラメーターがコピーされ、コピー コンストラクターが呼び出されます (記述されていない場合、コンパイラ自動的に提供されます) 、時間を無駄にし、時にはエラーを生成します。
たとえば、データ メンバーにポインターがある場合、コンパイラによって提供されるコピー コンストラクターは、元のポインターと同じアドレスを指すポインターを自動的にコピーするため、一方のアドレスを変更すると他方も変更されます。私たちが望まないもの。
必要な場合は、別のアドレスを指す新しいポインターをコピーする必要があります. 2 つのオブジェクトは、ポインターが指す変数の値が等しい限り、互いに干渉しません。独自のコピー コンストラクター、new などを記述します。そのため、通常は & を使用し、const を追加して、偶発的な変更を防ぎます。
以上がこの記事の全内容です. お役に立ちましたら「いいね」「ブックマーク」「フォロー」をお願いします. 読んでいただきありがとうございます.