(*it)->method() vs (**it).method
(*it)->method() vs (**it).method
迭代指针的向量(或其他容器)时,使用:
之间有任何区别和/或优势之间有任何区别。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); }
// ...
- 通过 get-Method 访问变量在类外不起作用
- 为什么我会" void value not ignored as it ought to be"?
- 为什么我的 BaseClass:Method 代码编译(带有单冒号)?
- 为什么当我为 for(auto& it : myUnorderedMap) {... = std::move(it.second)} 时,我会得到一个 const 引用?
- 如何在 c++ 中理解这样的代码 [request->headers().Method()->value().getStringView())]
- Is it good to use SDL_PIXELFORMAT_UNKNOWN?
- 这在C++ "It does not own the underlying data, and so is cheap to copy or assign"中意味着什么
- g++ [[noreturn]] on a virtual method
- QString::utf16(): Is it UB or not?
- 我正在"void value not ignored as it ought to be"我该怎么办?
- GotW #88 中的"It doesn’t work for references that are members of objects"是什么意思?
- 错误"pure virtual method called",当此方法已被覆盖时
- 如何修复此错误? "Method 'str' could not be resolved"
- 如何使用set<pair<int,int> >::iterator itrator it迭代set<pair<int,int> >st中的值?
- CMap with CArray Inside it
- 这个给定的代码应该将给定的数字转换为尽可能滞后的数字,no.by 用 9.It 替换合适的数字是行不通的
- 使用 -march 编译会导致线程说"pure virtual method called"
- 为什么在使用 auto&&it=--vec.end(),是 UB 时自动推导左值引用?
- (*it)->method() vs (**it).method
- C++迭代器运算符优先级问题 *it.method() vs (*it).method() vs it->method()