STL - 为什么要在迭代器中使用作用域解析运算符

7
访问STL迭代器时,为什么需要使用作用域解析运算符而不是点运算符?这是因为迭代器是静态的,不属于特定的类实例。
vector<int>::iterator my_iterator;

而不是

vector<int> numbers;
numbers.iterator;

5
因为 vector<int> 是一种类型,而不是一个变量。 - Andriy Tylychko
@AndyT,重点不在于vector<int>是一种类型,而在于vector<int>::iterator是一种类型,而不是vector<int>的数据成员,如果是后者,那么numbers.iterator将是正确的。 - nikolas
@Iceman numbers.iterator; 没有意义,因为一个容器可以使用尽可能多的迭代器。按照您的写法,一个容器只能有一个可能的迭代器。 - Stephane Rolland
@Slava 嘿,我给安迪T的评论点了个赞 :-). 但现在更严肃的是,如果 vector<int>::iterator 不是一个类型,那么就不能写成 vector<int>::iterator my_iterator; - Stephane Rolland
如果你看一下原帖中写的:numbers.iterator;,显然他不知道/理解iterator是一个类型。我认为这是值得提及的。 - Stephane Rolland
显示剩余5条评论
2个回答

12

点运算符和箭头运算符(->)用于访问特定实例的所有数据(成员变量、函数)。

作用域解析运算符用于访问特定类型的所有数据(静态成员变量、静态函数、类型),而不是实例。请注意,成员类型永远不会是特定于实例的,因此您将始终使用type::member_type来访问它们。


1

a::b 表示类型名称;a.b 表示变量引用。在您的例子中,my_iterator 是变量的名称,vector<int>::iterator 则是它的类型。


那么,:: 在这里并不是用于作用域解析的,是吗? - Iceman
不管 vector<int>::iterator 是一种类型,因为要访问静态变量仍然使用 ::。只有 vector<int> 是一种类型这个事实才重要。 - Andriy Tylychko
2
@Iceman:当然会。它表示应该在 vector<int> 的范围内查找 iterator - Mike Seymour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接