• C++中的链表节点用模板类和用普通类来实现的区别


    C++中的链表节点通常情况下类型都是一致的.因此我们可以用模板来实现.

    #include <iostream>
    using namespace std;
    
    template<typename Type>//定义一个模板类必须有的声明
    class LinkNode    //表示链表节点的类
    {
    public:
        LinkNode() :m_pnext(nullptr){}//构造函数,在函数体内实现的相当于默认在前面加了inline关键字修饰
        LinkNode(Type item, LinkNode* next=nullptr) :m_data(item), m_pnext(next){}//带默认参数的构造函数
        ~LinkNode(){ m_pnext = nullptr;}
    
        Type getData(){ return m_data; }//注意返回值类型,必须写上Type,要明确
    
        friend ostream& operator<<(ostream& out, LinkNode& node)//友元函数重载操作符,可以在类里面实现,也可以在类外面实现,
        {
            out << node.m_data;
            return out;
        }
    
        //friend ostream& operator<< <Type>(ostream& out, LinkNode& node)//在类外面实现友元函数,用于操作符重载时,必须明确类型,即<Type>不能少,否则报错
        
    
    private:
        Type m_data;
        LinkNode* m_pnext;//所有的LinkeNode后面都可以省略<Type>,因为这在一开始的类前面就定义了LinkeNode为模板类,默认就是和上面的类型一致
    };
    
    //template<typename Type>
    //ostream& operator<<(ostream& out, LinkNode<Type>& node)//在类的外边实现友元函数,注意在类里面声明时,需要明确类型operator<< <Type>(),否则报错
    //{
    //    out << node.m_data;
    //    return out;
    //}
    
    int main()
    {
        LinkNode<int> c;
        LinkNode<int> a(3,&c);
        cout << "a.m_data= "<<a << endl;
    
        system("pause");
        return 0;
    }


    2.如果不用类模板,就可以很简单了,比如我们用int类型:

    #include <iostream>
    using namespace std;
    
    struct LinkNode{
    public:
        LinkNode() :m_pnext(nullptr), m_data(0){}//用成员列表的方式来初始化构造函数,效率比在构造函数里面初始化高,m_data可以不用初始化,系统默认为0,但为了保险可以显示的初始化为0
        LinkNode(int num, LinkNode* next = nullptr) :m_data(num), m_pnext(next){}//带默认参数的构造函数
        ~LinkNode(){ m_pnext = nullptr; }
    
        int getData(){ return m_data; }
    
        friend ostream& operator<<(ostream& out, LinkNode& node);//友元函数,重载操作符,写在类里面和类外面都没有区别,没有模板那么麻烦,也不需要明确类型
        /*friend ostream& operator<<(ostream& out, LinkNode& node)
        {
            return out << node.m_data;
        }*/
    
    private:
        int m_data;//数据域,明确为int
        LinkNode* m_pnext;//指针域
    
    };
    
    ostream& operator<<(ostream& out, LinkNode& node)
    {
        return out << node.m_data;
    }
    
    int main()
    {
        LinkNode c;
        //LinkNode b();//报错,没有与之对应的构造函数,要么写b(3),或者b(3,&c),要么省略()
        LinkNode a(3,&c);
        cout <<"a.m_data= " << a << endl;
    
        system("pause");
        return 0;
    }
  • 相关阅读:
    jacman主题分页出现问题(Next<span></span>)
    后会有期(非技术)
    再谈前端性能优化
    emmet常用指令组合
    imagemagick在windows下安装(转,有改动)
    nth-child和蝉原则实现的奇妙随机效果(译)
    flex布局浅谈和实例
    css命名那些事儿
    chrome开发者工具浅析--timeline
    浏览器历史和发展趋势浅析
  • 原文地址:https://www.cnblogs.com/ttss/p/4148897.html
Copyright © 2020-2023  润新知