小区物业管理网站开发报告,deal 网站要怎么做,百度经验官网入口,pc网站模板利用想定义一个带头双向链表的迭代器 只能通过在 带头双向链表的类 中同一个命名空间中 再定义一个类 这个类规定 带头双向链表中迭代器的行为 下面的设计需要注意#xff1a; 1. 定义的这个类需要写出构造函数#xff0c; 1.1 构造函数… 利用想定义一个带头双向链表的迭代器 只能通过在 带头双向链表的类 中同一个命名空间中 再定义一个类 这个类规定 带头双向链表中迭代器的行为 下面的设计需要注意 1. 定义的这个类需要写出构造函数 1.1 构造函数规定了ListIterator这个类的实例创建出来 就一定是一个指向List 中的一个类型为 Node的结点 的指针 再typedef ListNodeT Node; 一次进行封装 1.2 ListIterator看不到Node这个类型所以只能在 ListIterator 中 2. 定义的这个类不需要写出拷贝构造 和 析构函数 2.1 因为ListIterator的实例 一定是一个指针指针指向的变量的类型不确定 但是该实例仍然是一个内置类型 C类中生成的默认拷贝构造会对 内置类型的指针 进行浅拷贝 也就是在写下iterator it1(it2); (也就相当于ListIteratorT it1(it2);)这样的代码时 可以直接利用 ListIterator默认的拷贝构造让两个指针的值完全一样 2.2 不用写析构函数的原因是ListerIterator的实例是指向list中的一个结点的 要delete这个结点也是 list 实例的对象调用析构来delete 而不是通过迭代器 去释放结点的空间
方法一 下面专门实现了 ListConstIterator 这个类来规定一部分迭代器的行为 如果你的迭代器需要 只读这里的只读是指 迭代器所指向的结点中的数据不能被修改 那么在 ListConstIterator 这个类中可以刻意修改operator* 和 operator- 对两个运算符重载的返回值 进行const修饰 下面返回链表的头指针可以有几种方法 一、直接使用匿名对象返回这也是匿名对象的一种常用用法 二、利用构造函数对iterator进行初始化然后返回这个迭代器实例 三、直接返回_head-_next 实际上发生了隐式类型转换由于ListIterator这个类中ListIterator(Node* node) 这个函数是单参数的所以可以直接返回_head-_next return iterator(_head-_next); return _head-_next; 在list所创建的类中迭代起的产生都是通过list中的 begin()或end()方法实现的 要想传入一个const listT 类型的对象输出一个const修饰的迭代器 在定义专门针对const listT 类型的对象 输出迭代器的时候 必须使用const_iterator这种匿名对象进行实现 aa2的构造函数是一个多参数的函数 也可以使用{ 1, 1 }进行隐式类型转换 也就是说 A aa2 { 1, 1 }; 这句话发生了隐式类型转换 注意 这里{ 1, 1 }并不是数组只是因为要使用这种隐式类型转换时 如果构造函数是多参数的那么只能用花括号 {} 进行包括 利用匿名对象A(2, 2)进行初始化时 将通过 先构造 再 拷贝构造的 虽然利用下面的方法能够利用解引用迭代器然后去访问 A 这个结构体中的成员 但是不能通过 it-_al来访问 结构体中的成员 所以实际上想要将iterator作为 控制 list 成员 的类 应该再重载 - 这个运算符 重载完成后下面代码中的 it-等价于_node-_data 所以实际上想要通过箭头得到_a1这个成员应使用 it--_a1 这种方式 此时编译器做了优化让程序员可以直接使用 it-_a1 获得成员 那么it--_a1就不再合法 但是可以使用如下的方式调用 cout it.operator-()-_a1 : it.operator-()-_a2 endl; cout (*it)._a1 : (*it)._a2 endl;