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; }