c++单链表【构造函数、运算符重载、析构函数、增删查改等】
c++中的單向鏈表寫法:實(shí)現(xiàn)增刪查改、構(gòu)造函數(shù)、運(yùn)算符重載、析構(gòu)函數(shù)等。
建立頭文件SList.h
#pragma?oncetypedef?int?DataType; //SList要訪問SListNode,可以通過友元函數(shù)實(shí)現(xiàn),友元函數(shù)在被訪問的類中 class?SListNode {friend?class?SList;//友元函數(shù) public:SListNode(const?DataType?x):_data(x),?_next(NULL){} private:SListNode*?_next;DataType?_data; };class?SList { public:SList():_head(NULL),?_tail(NULL){}//深拷貝SList(const?SList&?s):_head(NULL),?_tail(NULL){SListNode*?cur?=?s._head;while?(cur){this->PushBack(cur->_data);cur?=?cur->_next;}}深拷貝的傳統(tǒng)寫法//SList&?operator=(const?SList&?s)//{// if?(this?!=?&s)// {// Clear();// SListNode*?cur?=?s._head;// while?(cur)// {// this->PushBack(cur->_data);// cur?=?cur->_next;// }// }// return?*this;//}//深拷貝的現(xiàn)代寫法SList&?operator=(SList&?s){swap(_head,?s._head);swap(_tail,?s._tail);return?*this;}~SList(){Clear();} public:void?Clear();void?PushBack(DataType?x);void?PopBack();void?PushFront(DataType?x);void?PopFront();//void?Insert(size_t?pos,DataType?x);void?Insert(SListNode*?pos,?DataType?x);void?Erase(SListNode*?pos);SListNode*?Find(DataType?x);void?PrintSList(); private:SListNode*?_head;SListNode*?_tail; };各函數(shù)的實(shí)現(xiàn)
各操作的測試用例
void?Test1() {//尾插尾刪SList?S;S.PushBack(1);S.PushBack(2);S.PushBack(3);S.PushBack(4);S.PrintSList();S.PopBack();S.PrintSList();//S.PopBack();//S.PopBack();//S.PrintSList();//S.PopBack();//S.PopBack();//S.PopBack();SList?S1(S);S1.PrintSList();SList?S2;S2?=?S;S2.PrintSList(); }void?Test2() {//頭插頭刪SList?S;S.PushFront(1);S.PushFront(2);S.PushFront(3);S.PushFront(4);S.PrintSList();S.PopFront();S.PrintSList();S.PopFront();S.PopFront();S.PopFront();S.PrintSList();S.PopFront(); }void?Test3() {//指定位置插入某數(shù),查找某數(shù)SList?S;S.PushBack(1);S.PushBack(2);S.PushBack(4);S.PushBack(5);S.PrintSList();//S.Insert(3,?3);SListNode*?p?=?S.Find(4);S.Insert(p,?3);S.PrintSList(); }void?Test4() {//刪除某結(jié)點(diǎn)SList?S;S.PushBack(1);S.PushBack(2);S.PushBack(3);S.PushBack(10);S.PushBack(4);S.PushBack(5);S.PrintSList();SListNode*?p?=?S.Find(10);S.Erase(p);S.PrintSList(); }友元函數(shù)
? ? ?在實(shí)現(xiàn)類之間數(shù)據(jù)共享時,減少系統(tǒng)開銷,提高效率。如果類A中的函數(shù)要訪問類B中的成員(例如:智能指針類的實(shí)現(xiàn)),那么類A中該函數(shù)要是類B的友元函數(shù)。具體來說:為了使其他類的成員函數(shù)直接訪問該類的私有變量。即:允許外面的類或函數(shù)去訪問類的私有變量和保護(hù)變量,從而使兩個類共享同一函數(shù)。
實(shí)際上具體大概有下面兩種情況需要使用友元函數(shù):
(1)運(yùn)算符重載的某些場合需要使用友元。
(2)兩個類要共享數(shù)據(jù)的時候。
1.1使用友元函數(shù)的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):能夠提高效率,表達(dá)簡單、清晰。
缺點(diǎn):友元函數(shù)破環(huán)了封裝機(jī)制,盡量不使用成員函數(shù),除非不得已的情況下才使用友元函數(shù)。
1.2友元函數(shù)的參數(shù)
因?yàn)橛言瘮?shù)沒有this指針,則參數(shù)要有三種情況:
(1)?要訪問非static成員時,需要對象做參數(shù);
(2)要訪問static成員或全局變量時,則不需要對象做參數(shù);
(3)如果做參數(shù)的對象是全局對象,則不需要對象做參數(shù);
1.3友元函數(shù)的位置
因?yàn)橛言瘮?shù)是類外的函數(shù),所以它的聲明可以放在類的私有段或公有段且沒有區(qū)別。
1.4友元函數(shù)的調(diào)用
可以直接調(diào)用友元函數(shù),不需要通過對象或指針
友元函數(shù)和類的成員函數(shù)的區(qū)別
成員函數(shù)有this指針,而友元函數(shù)沒有this指針。
友元函數(shù)是不能被繼承的,就像父親的朋友未必是兒子的朋友。
轉(zhuǎn)載于:https://blog.51cto.com/luoyafei/1748574
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的c++单链表【构造函数、运算符重载、析构函数、增删查改等】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 151. Reverse Words i
- 下一篇: 京东聚合收银(会员码支付)接口封装C++