メンバー演算子には次の2つのタイプがあります。
- 間接参照演算子*
- 矢印演算子->
設計基準
- 矢印演算子はクラスのメンバーである必要があります。
- 間接参照演算子は通常、クラスのメンバーでもありますが、そうである必要はありません。
- オーバーロードされた矢印演算子は、カスタム矢印演算子を使用してクラスまたはクラスのオブジェクトへのポインタを返す必要があります
- 間接参照と乗算の違いは、一方が単項演算子で、もう一方が二項演算子であるということです。
例えば。
class StrBlobTest {
size_type size() const {
return data->size(); }
std::string& operator*()const
{
return (*data)[i];
}
std::string* operator->()const
{
return &this->operator*(); //返回解引用结果的地址
}
...
}
StrBlobTest v1("a", "b");
*v1 = "123555";
std::cout << (&v1)->size() << std::endl;//调用 StrBlobTest 的size()函数
std::cout << v1->size() << std::endl;//调用 std::string* operator->()const
point-> memの形式の式の場合、pointは、クラスオブジェクトまたはoperator->をオーバーロードするクラスのオブジェクトへのポインタである必要があります。ポイントの種類が異なり、point-> memの意味も異なります。
1. pointがポインターの場合、組み込みの矢印演算子が呼び出され、式は(* point).memと同等です。
2. pointがoperator->をオーバーロードするクラスのオブジェクトである場合、point.operator->()の結果を使用してmemを取得し、式は(point.operator->())-> memと同等です。その中で、結果がポインタの場合、最初のステップが実行されます。結果自体にオーバーロードされた演算子->が含まれている場合、現在のステップが繰り返し呼び出されます。
【参照】