【C++初級】ostream&、operator<<、operator<<(ostream& _cout、const Date& d)、bool誘導構造埋め込み比較関数の解析

 C++ のオーバーロードと判断の知識を整理する 

目次

1. bool operator>(const Date& d) const [bool 誘導構造埋め込み比較関数]

1. コードの全体的な意味

2. コード内の 2 つの const の意味

二、friend ostream& operator<<(ostream& _cout, const Date& d)

1. 関連する基本概念 

2. 3 つの参照 &


問題は次の日付クラスから来ています

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 を追加して、偶発的な変更を防ぎます。


以上がこの記事の全内容です. お役に立ちましたら「いいね」「ブックマーク」「フォロー」をお願いします. 読んでいただきありがとうございます.

おすすめ

転載: blog.csdn.net/Captain_ldx/article/details/129652275