1、容器list
当你对某个type实施operator->,而该type并非built-in ptr时,编译器会做一件很有趣的事,在找出user-defined operator->并将它施行于该type后,编译器会对执行结果再次施行operator->。编译器不断执行这些动作直至触及a pointer to built-in type,然后才进行成员存取。
2、list的iterator --- list的迭代器
以operator++操作符为例。
(1)前++
self& operator++() { node = (link_type)((*node).next); return *this; }
return by reference,通过引用返回,因此不会引起操作符重载。
(2)后++
self operator++(int) { self tmp = *this; ++*this; return tmp; }
1> 记录原值 self tmp = *this;
此步不会引起operator*操作,因为先考虑的是=,即赋值操作,因此做的是拷贝构造操作。
2> 进行操作 ++*this,不会引起operator*操作,即++*this调用的是operator++()操作。
3> 返回原值,也调用的是拷贝构造函数,将值返回。
那么现在存在一个问题,为什么前++返回的是引用,而后++返回的是值类型呢?而且后++的操作符重载有一个int参数?
1> 后++的操作符重载有一个int参数,C++语法规定,为了区分前++与后++操作符重载的区别,因此在后++操作符参数多一个int类型的参数以标识区别。
2>为什么前++返回的是引用,而后++返回的是值类型呢?
这个功能我们所根据int类型的前++与后++所仿写的。
int i = 6;
++++i; -> ++(++)i;
i++++; -> (i++)++; // 这个是行不通的
因此list容器的++操作符重载也采用仿int类型的操作,前++可以多次++,即返回值采用引用,而后++不可以多次++,即返回值采用值返回。
2.9版本-》4.9版本
list继承于_List_base,_List_base里有一个_List_impl,_List_impl继承于_A<_List_node>,_List_impl有一个_List_node_base,_List_node继承于_List_node_base。
2、Iterator设计需要遵循的原则
Iterator必须提供的5种associated types
即
typedef bidirectional_iterator_tag iterator_category;
typedef _Tp value_type;
typedef _Tp* pointer;
typedef _Tp& reference;
typedef ptrdiff_t difference_type;
value_type的主要目的是用来声明变量,而声明一个无法被赋值的变量没什么用,所以iterator(即便是constant iterator)的value_type不应加上const,iterator若是const int,其value_type应该是int,而非const int。