2

我的背景是更受管理的语言(C#、python),但我在 C/C++ 方面的经验越来越丰富。我很熟悉为什么通过引用选择 (.) 和通过指针操作 (->) 选择操作符是不同的。在我遇到的所有情况下,如果您使用不正确的一种,则会导致编译错误。如果是这样,他们为什么不成为一个操作员?是否存在在同一个对象上使用任何一个会导致不同、有意义和有用的结果的情况?

这个问题的灵感来自这个答案: 这是在 c++ 中调用函数的正确方法吗?

4

4 回答 4

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 回答
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 回答
2

是否存在通过引用选择元素和通过指针操作选择元素都有效的情况?

Since you can overload operator->() in C++, you can actually arrive at situations where you can use -> and . interchangeably on the same object. You can even engineer things so that you get a different result, as per this example:

#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();
}

Of course, in real code you would never do something as crazy as this (although I have seen this kind of thing in "production" code).

于 2013-07-09T14:07:58.387 回答
2

the short answer would be a smart pointer

you can access the smart pointer class arguments using the "." (if you make your own smart pointer class you can extract from there for instance the current reference count) while you would use the "->" operator to access whatever is being stored using the smart pointer.

于 2013-07-09T14:53:37.600 回答