自学内容网 自学内容网

03.31_111期_C++_list特性和使用

    利用想定义一个带头双向链表的迭代器
    只能通过在  带头双向链表的类  中同一个命名空间中 再定义一个类
    这个类规定 带头双向链表中迭代器的行为
     下面的设计需要注意:
         1. 定义的这个类需要写出构造函数,
            1.1 构造函数规定了ListIterator这个类的实例创建出来,
                就一定是一个指向List 中的一个类型为 Node的结点  的指针
                再typedef ListNode<T> Node; 一次,进行封装
            1.2 ListIterator看不到Node这个类型,所以只能在 ListIterator 中
     
         2. 定义的这个类不需要写出拷贝构造 和 析构函数
            2.1 因为ListIterator的实例 一定是一个指针,指针指向的变量的类型不确定
                但是该实例仍然是一个内置类型,
                C++类中生成的默认拷贝构造会对 内置类型的指针  进行浅拷贝
                也就是在写下iterator it1(it2); (也就相当于ListIterator<T> 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 list<T> 类型的对象,输出一个const修饰的迭代器
        在定义专门针对const list<T> 类型的对象 输出迭代器的时候,
        必须使用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;


原文地址:https://blog.csdn.net/weixin_46366676/article/details/137346645

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!