2

私のバックグラウンドはより管理された言語 (C#、python) ですが、C/C++ の経験も積んでいます。参照による選択 (.) 演算子とポインター操作による選択 (->) 演算子が異なる理由はよくわかっています。私が遭遇したすべてのケースで、間違ったものを使用すると、コンパイル エラーが発生します。もしそうなら、なぜ彼らは1人のオペレーターにされなかったのですか?同じオブジェクトでどちらかを使用すると、異なる意味のある有用な結果が得られる場合はありますか?

この回答に触発されたこの質問: Is this right way to call a function in c++?

4

4 に答える 4

3

->基本型への参照には適用できず、.ポインターにも適用できませんが、ユーザー定義型には両方を適用でき、それらは異なる意味を持ちます。最も単純な例は、次のようなスマート ポインターですstd::shared_ptr

struct A { int x; };

std::shared_ptr<A> p(new A);
p->x = 10;
p.reset();
于 2013-07-09T14:00:10.770 に答える
3

->C++ では、ほとんどすべてのスマート ポインターの実装で使用される -operatorをオーバーロードできます。ただし、それらの一部には独自のメソッド、つまり参照を解放するものもあります。

struct test {
    int x;
};

std::shared_ptr<int> ptr(new test);

// Write to member x of the allocated object
ptr->x = 3;
// Reset the shared pointer to point to a different object.
// If there are no further shared_ptrs pointing to the previously allocated one,
// it is deleted.
ptr.reset(new test)

さらに、コンパイラが operator- を解決するのは、.複数レベルのポインターのようなもの、つまりtest*** ptr. あなたのロジックではptr.x、 、(*ptr).x(**ptr).xおよび(***ptr).xすべて同じになります。

于 2013-07-09T13:59:07.353 に答える
2

簡単な答えはスマートポインターです

「.」を使用して、スマート ポインター クラスの引数にアクセスできます。(独自のスマート ポインター クラスを作成する場合は、そこから現在の参照カウントなどを抽出できます) 一方、"->" 演算子を使用して、スマート ポインターを使用して格納されているものにアクセスします。

于 2013-07-09T14:53:37.600 に答える
2

参照による要素選択とポインタ操作による要素選択の両方が有効な場合はありますか?

C++ ではオーバーロードできるため、同じオブジェクトに対してと を交換可能にoperator->()使用できる状況に実際に到達できます。次の例のように、別の結果が得られるように設計することもできます。->.

#include <iostream>

struct Bar
{
  void hello() const { std::cout << "Bar!!!\n"; }
};

struct FooBar
{
  Bar bar;
  void hello() const { std::cout << "FooBar!!!\n"; }
  const Bar* operator->() const {return &bar; }
};

int main()
{
  FooBar fb;
  fb->hello();
  fb.hello();
}

もちろん、実際のコードでは、これほどおかしなことをすることはありません (私はこの種のことを「実稼働」コードで見たことがありますが)。

于 2013-07-09T14:07:58.387 に答える