(*it)->method() vs (**it).method

(*it)->method() vs (**it).method

本文关键字:method it vs gt      更新时间:2023-10-16

迭代指针的向量(或其他容器)时,使用:

之间有任何区别和/或优势之间有任何区别。
for (it = v.begin(); it != v.end(); ++it) {
    (*it)->method();
}

for (it = v.begin(); it != v.end(); ++it) {
    (**it).method();
}

在C语言中,没有区别。但是,在C 中,->运算符可以重载,而成员选择.操作员不能。

因此,在(*foo)->bar中,*foo可以指定一个类似于智能指针的类对象,尽管如果foo是标准的C 指针容器上的迭代器,则不会发生这种情况,这意味着*foo评估指针。

(**foo).bar中,**foo必须是一个名为bar(可访问)的成员的类对象。

也可以重载一单元*(这是迭代器foo(类对象)返回其引用的对象)。

换句话说,表达式 can can 在含义上差异,但是如果 *foo是指向类/struct的指针,则从c语言中继承的等效性适用: (*ptr).member等于 ptr->member。<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<</p>

它们是等效的:定义标准(用于指针)

5.2.5类成员访问[expr.ref]
2:对于第一个选项(DOT),第一个表达式应具有完整的类类型。对于第二个选项(箭头),第一个表达式应具有完成类型的指针。表达式E1-> E2被转换为equielentform(*(E1))。e2 ;5.2.5的其余部分将仅处理第一个选项(DOT).65无论哪种情况,ID表达式均应命名课程成员或其基类之一的成员。

类和覆盖 ->和 *运算符在此处无关紧要,因为容器包含指针。

因此:

(*it)->method();
// Is equivelent to:
(*((*it))).method();
// This is equivelent too:
(**it).method(); // thus both expressions are identical in this context.

no。->只是说将结构作为指针访问。.的作用好像只是一个结构。它是阴道的 - 功能方面没有区别。

编辑:您可以超载->使其做一些不同的事情,尽管假设您不这样做是相同的。不确定为什么要这样做,但是如果您这样做,则必须使用额外的*再次解除结构。

它们是一样的。您可以根据使用的编码约定使用一个或另一个。

->*操作员可以重载,而.运算符不能。

在Ubuntu 12.04上以以下方式实现的列表迭代器:

template<typename _Tp>
struct _List_iterator
{
  // ...
  reference
  operator*() const
  { return static_cast<_Node*>(_M_node)->_M_data; }
  pointer
  operator->() const
  { return std::__addressof(static_cast<_Node*>(_M_node)->_M_data); }
  // ...