程式如下:
標頭檔案:
#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...