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

时间:2013-07-09 13:56:38

标签: c++ c

我的背景是更多托管语言(C#,python),但我在C / C ++方面的经验越来越丰富。我熟悉为什么通过引用(。)选择和通过指针操作( - >)运算符选择是不同的。在我遇到的所有情况下,如果你使用不正确的,它将导致编译错误。如果是这样的话,他们为什么不成为一个运营商呢?是否存在使用同一对象产生不同,有意义和有用结果的情况?

这个问题的灵感来自于这个答案: Is this right way to call a function in c++?

4 个答案:

答案 0 :(得分:3)

在C ++中,您可以重载-> - 运算符,该运算符几乎用于所有智能指针实现。但是,其中一些也有自己的方法,即发布参考文献。

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)

此外,编译器解析运算符 - .以获取多级指针(即test*** ptr)会非常麻烦。根据您的逻辑,ptr.x(*ptr).x(**ptr).x(***ptr).x都是相同的。

答案 1 :(得分:3)

您不能将->应用于对基本类型的引用,也不能将.应用于指针,但您可以将两者应用于用户定义的类型,它们将具有不同的含义。最简单的例子是智能指针,如std::shared_ptr

struct A { int x; };

std::shared_ptr<A> p(new A);
p->x = 10;
p.reset();

答案 2 :(得分: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();
}

当然,在实际代码中,你永远不会做出像这样疯狂的事情(尽管我在“生产”代码中看到过这种事情)。

答案 3 :(得分:2)

简短的回答是智能指针

您可以使用“。”访问智能指针类参数。 (如果您创建自己的智能指针类,则可以从那里提取,例如当前引用计数),同时使用“ - &gt;”运算符使用智能指针访问正在存储的内容。