我的背景是更多托管语言(C#,python),但我在C / C ++方面的经验越来越丰富。我熟悉为什么通过引用(。)选择和通过指针操作( - >)运算符选择是不同的。在我遇到的所有情况下,如果你使用不正确的,它将导致编译错误。如果是这样的话,他们为什么不成为一个运营商呢?是否存在使用同一对象产生不同,有意义和有用结果的情况?
这个问题的灵感来自于这个答案: Is this right way to call a function in c++?
答案 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;”运算符使用智能指针访问正在存储的内容。