C ++入門:第14章:算術演算子、関係演算子

通常、非メンバ関数として定義我々演算リレーショナル演算子は、左または右のオペランドが変換可能にします。典型的には、変化状態オペランドに必要なこれらの演算子ので、参照パラメータは定数であるからです。

算術演算子は、通常、その2つのオブジェクトを計算し、多くの場合、ローカル変数内に配置された任意のオペランド、異なる新たな値を取得、コピー操作は、ローカル変数として結果を返すように完成されます。クラスは、算術演算子を定義する場合、それはまた、一般に、対応する化合物代入演算子を定義します。この時点で、最も効果的な方法は、算術演算子を定義する化合物割り当てを使用することです。

//假设两个对象指向同一本书
Sales_data operator+(const Sales_data& lhs, const Sales_data& rhs) {
	Sales_data sum = lhs;     
	sum += rhs;              
	return sum;              
}

我々 LHSは、ローカル変数の和にコピーし、その後SALES_DATA複合代入演算子は、RHSの合計値に加算され、機能は最後の和のコピーを返します。
クラスはまた、算術演算子及び関連化合物の代入演算子を定義している場合、ケースは、通常、算術複合代入演算子を使用して実装されなければなりません。

あなたはそれらの定義を与え、他の算術演算子のようなSALES_DATAもサポートする必要がありますどう思いますか

class Sales_data {
	friend Sales_data operator-(const Sales_data& lhs, const Sales_data& rhs);
public:
	Sales_data& operator-=(const Sales_data &rhs)
};
Sales_data operator-(const Sales_data& lhs, const Sales_data& rhs) {
	Sales_data sub = lhs;
	sub -= rhs;
	return sub;
}
Sales_data& Sales_data::operator-=(const Sales_data& rhs) {
	units_sold -= rhs.units_sold;
	revenue -= rhs.revenue;
	return *this;
}

なぜ+ =演算子+コールオペレータは、他の方法よりも効果的で定義する
ゼロからオペレータ+の実装が実現するオペレータ+ =の方法により比較し、明らかに、後者は明らかに読みやすくている間何の利点は、性能の点ではありません。したがって、この例では、コードの再利用が最良の方法です。

等価演算子
2つのオブジェクトが等しいかどうかをテストするには、等価演算子によって定義されます。各データメンバは、比較してオブジェクト、およびすべてのメンバーは、対応する二つのオブジェクトに等しい場合にのみ等しいと考えられます。

bool operator==(const Sales_data& lhs, const Sales_data& rhs) {
	return lhs.isbn() == rhs.isbn() && lhs.units_sold == rhs.units_sold && lhs.revenue == rhs.revenue;
}
bool operator!=(const Sales_data& lhs, const Sales_data& rhs) {
	return !(lhs == rhs);
}

仕事の平等と等しくない演算子演算子は、演算子のいずれかが、他の事業者の実際の比較のために責任を負わなければならないことを意味は、それだけで本当に作業オペレーターを呼び出した別の、に委託する必要があります。

StrBlobクラス、StrBlobPtrクラス、StrVecクラスであり、文字列演算子は等しいと不平等演算子を定義します

class StrBlob {
	friend bool operator==(const StrBlob& lhs, const StrBlob& rhs);
	friend bool oprator!=(const StrBlob& lhs, const StrBlob& rhs);
};
bool operator==(const StrBlob& lhs, const StrBlob& rhs) {
	return lhs.data == rhs.data;
}
bool operator!=(const StrBlob& lhs, const StrBlob& rhs) {
	return !(lhs == rhs);
}
class StrBlobPtr {
	friend bool operator==(const StrBlobPtr& lhs, const StrBlobPtr& rhs);
	friend bool oprator != (const StrBlobPtr& lhs, const StrBlobPtr& rhs);
};
bool operator==(const StrBlobPtr& lhs, const StrBlobPtr& rhs) {
	auto l = lhs.wptr.lock(), r = rhs.wptr.lock();
	if (l == r)      //两个指针都为空,或指向相同的vector且curr指向相同元素时,相等,否则不相等
		return (!r || lhs.curr == rhs.curr);
	else
		return false;
}
bool operator!=(const StrBlobPtr& lhs, const StrBlobPtr& rhs) {
	return !(lhs == rhs);
}
class StrVec {
	friend bool operator==(const StrVec& lhs, const StrVec& rhs);
	friend bool operator!=(const StrVec& lhs, const StrVec& rhs);
};
bool operator==(const StrVec& lhs, const StrVec& rhs) {
	if (lhs.size() != rhs.size()) {
		return false;
	}
	for (auto itr1 = lhs.begin(), itr2 = rhs.begin(); itr1 != lhs.end() && itr2 != rhs.end(); itr1++, itr2++) {
		if (*itr1 != *itr2) {
			return false;
		}
	}
	return true;
}
bool operator!=(const StrVec& lhs, const StrVec& rhs) {
	return !(lhs == rhs);
}
class String {
	friend bool operator==(const String& lhs, const String& rhs);
	friend bool operator!=(const String& lhs, const String& rhs);
private:
	const char* str;
};
bool operator==(const String& lhs, const String& rhs) {
	return strcmp(lhs.str, rhs.str);
}
bool operator!=(const String& lhs, const String& rhs) {
	return !(lhs == rhs);
}

関係演算子は、
等価演算子は、多くの場合、関係演算子が含まれて定義されています。具体的には、容器に少ないオペレータより使用に関連するいくつかのアルゴリズムは、オペレータの定義は、<有用であり得るからです。
なるように一般的に関係演算子
1、シーケンスは、キーワードの要件と、それは一貫性を保つために、コンテナに関連付けられた関係を定義しました。
2、クラスも等しく一致するとの関係を定義することができ、==オペレータが含まれている場合。具体的には、2つのオブジェクトがある場合は!=、ターゲットは、他よりも小さくなければなりません。

唯一の信頼できる論理<定義が存在する場合、これは<演算子を定義するために考慮されるべきです。クラスはまた<一致のみ<演算子を定義した場合と場合にのみ、==含まれている場合の定義と同じ結果を生成します。

公開された79元の記事 ウォンの賞賛4 ビュー2323

おすすめ

転載: blog.csdn.net/CLZHIT/article/details/104094645