C ++入門書の5番目の注意事項(第14章オーバーロードされた演算と型変換)算術演算子と関係演算子

オペレーター
双眼算術演算子 +(加算)、-(減算)、*(乗算)、/(除算)、%(モジュロ)
関係演算子 ==(等しい)、!=(等しくない)、<(より小さい)、>(より大きい>、<=(以下)、> =(以上)
  • 通常の状況では、算術演算子と関係演算子は、両側のオペランドを変換できるように、非メンバー関数として定義する必要があります。
  • これらの演算子は通常、オペランドの状態を変更しないため、仮パラメーターは定数参照です。
  • クラスが算術演算子と関連する複合代入演算子を同時に定義する場合、通常は複合代入を使用して算術演算子を実装する必要があります。

1.算術演算子

通常、2つのオペランドを計算し、新しい値を取得します。この値は通常、ローカル変数に格納されます。操作が完了すると、結果としてローカル変数のコピーが返されます(戻り値の型をに設定することをお勧めします)。元のオブジェクトのconstタイプ)。

Sales_data operator +(const Sales_data &lhs,const Sales_data &rhs)
{
    
    
	Sales_data sum = lhs;
	sum += rhs;
	return sum;
}

2.等式演算子

設計基準:

  • クラスが論理的に等しいという意味を持っている場合、通常の名前付き関数の代わりにoperator ==を定義する必要があります。これにより、標準のライブラリコンテナとアルゴリズムが使いやすくなり、覚えやすくなります。
  • 通常の状況では、operator ==は推移的である必要があります。
  • クラスがoperator ==を定義している場合は、operator!=も定義する必要があります。
  • operator ==とoperator!=の一方は、特定の作業をもう一方に委任する必要があります。
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);
}

3.代入演算子

  • 仮パラメーターのタイプに関係なく、代入演算子演算子はメンバー関数として定義する必要があり、複合代入演算子は通常同じです。
  • どちらのタイプの演算子も、左側のオペランドへの参照を返す必要があります(代入演算子と複合代入演算子)。
  • 操作オブジェクトの右側として他のタイプを使用できます
//重载赋值运算符
StrVec &StrVec::operator=(initializer_list<string> il)
{
    
    
    //alloc_copy分配内存空间,并从给定安慰内拷贝元素
    
    auto data=alloc_n_copy(il.begin(),il.end());
    free();  // 销毁对象中的元素并释放内存空间

    elements=data.frist;//更新数据成员,使其指向新空间

    first_free=cap=data.second; 
    return *this;  

} 
 
//复合赋值运算符 
// member binary operator: left-hand operand is bound to the implicit this pointer
// assumes that both objects refer to the same book
Sales_data& Sales_data::operator+=(const Sales_data &rhs)
{
    
    
    units_sold += rhs.units_sold;
    revenue += rhs.revenue;
    return *this;
}

4.関係演算子

順序関係を定義します。例:連想コンテナで使用される演算子未満

  • クラスが論理的に同等である場合、クラスはoperator ==を定義する必要があります。
  • 等式演算子を定義するクラスは通常、関係演算子も定義します。
  • クラスがoperator ==を定義する場合、関係演算子の定義はoperator ==と一致している必要があります。特に、2つのオブジェクトが等しくない場合は、一方のオブジェクトをもう一方のオブジェクトよりも小さくする必要があります。
  • 信頼できる<定義が1つしかない場合は、このクラスの<演算子の定義を検討する必要があります。クラスに==も含まれている場合、<の定義が==によって生成された結果と一致する場合にのみ、<演算子が定義されます。
//重载复合赋值运算符
StrVec &StrVec::operator+=(initializer_list<string> il)
{
    
    
   unit_sold+=rhs.units_sold;
   revenue+=rhs.revenue;
   return *this;
}

おすすめ

転載: blog.csdn.net/thefist11cc/article/details/113927930