極簡版shared ptr實現

2021-09-29 06:54:10 字數 2332 閱讀 7729

程式如下:

標頭檔案:

#ifndef pch_h

#define pch_h

#include#includeusing namespace std;

class like_shared_ptr

//接受指標的建構函式

like_shared_ptr(string* a) :location(a), number(new int(1)) {}

//拷貝建構函式

like_shared_ptr(const like_shared_ptr&);

//析構函式

~like_shared_ptr();

//賦值運算子

like_shared_ptr& operator =(like_shared_ptr);

//*運算子

string& operator *()const;

//->運算子

string* operator->()const;

private:

//計數器

int* number;

//內容的指標

string* location;

//此函式用於定義交換操作,替代標準庫的swap函式

};void swap(like_shared_ptr&, like_shared_ptr&);

bool comparesize(const like_shared_ptr&, const like_shared_ptr&);

#endif //pch_h

/*標頭檔案裡面除非是非常簡單的程式,否則不要定義函式,太亂的話,不利於自己維護和***/

.cpp檔案:

#include "pch.h"

//拷貝賦值

like_shared_ptr& like_shared_ptr::operator =(like_shared_ptr a)

//存在多個

else

/*location = a.location;

number = a.number;*/

swap(*this, a);

//為空的情況不需要number++

if (location != null)

++*number;

return *this;

}//拷貝構造

like_shared_ptr::like_shared_ptr(const like_shared_ptr& a)

//析構

like_shared_ptr::~like_shared_ptr()

else

}//*運算子過載(可以時一元運算子也可以是二元運算子,根據過載函式中的引數來)

string& like_shared_ptr::operator *()const

//->運算子過載(一元運算子,只接受乙個餐宿)

string* like_shared_ptr::operator ->()const

/*這裡引數要是引用,不然會出現沒有交換而訪問釋放了的位址的錯誤,訪問控制錯誤

實際上根據本例的的要求並不需要定義這個swap函式,僅僅是想要實驗一番*/

void swap(like_shared_ptr& a,like_shared_ptr& b)

//比較like_shared_ptr大小函式

bool comparesize( const like_shared_ptr& a, const like_shared_ptr& b)

main函式:

#include "pch.h"

#include #include#include#includeusing namespace std;

int main()

}/*總結:

1.運算子*和—>運算子過載:

如果返回的時物件指標的話,不需要再->來使用成員變數和成員函式,直接即可。而對於返回的時物件,則需要加.來使用

或許可以從這裡看到點什麼東西。

當我們用指標訪問物件時,可以直接訪問私有成員。

而用物件的話,並不能直接訪問私有成員。或許這兩者之間底層的實現方式不同哦。

這裡->運算子之後好像只能接成員變數和成員函式,其他的都會報錯

2.全域性函式的問題,

全域性變數要再標頭檔案中進行宣告,不管是不是友元函式,都是這樣。

*/

額,對於這個程式沒有什麼要說的,主要是了解shared_ptr如何可以多個指向同一段堆空間的實現方式。

之前考慮也可以通過類的靜態成員變數來實現,但是標準庫採用了這種方式來實現。利弊大家可以思考思考哦。

Virtual Dom Diff原理,極簡版

先介紹乙個概念virtual dom,我猜大家或多或少都應該知道什麼是virtual dom吧,簡單來說就是用js來模擬dom中的結點。下面就是乙個virtual dom的結構,包含了標籤名,擁有的屬性,孩子結點,render函式 class element this.children childr...

C 記憶體池的極簡版實現

當在乙個函式中需要大量使用new來申請臨時用的陣列或物件時,用完之後需要對每乙個new出來的陣列進行釋放,特別當乙個函式特別長的時候,如在我廠的系統中,1000行的函式是經常的 要去找出之前寫的每乙個new然後寫對應的delete,這是極不美觀且易漏掉的,因此使用自己的記憶體管理方案是很有好處的 1...

C 記憶體池的極簡版實現

當在乙個函式中需要大量使用new來申請臨時用的陣列或物件時,用完之後需要對每乙個new出來的陣列進行釋放,特別當乙個函式特別長的時候,如在我廠的系統中,1000行的函式是經常的 要去找出之前寫的每乙個new然後寫對應的delete,這是極不美觀且易漏掉的,因此使用自己的記憶體管理方案是很有好處的 1...