1. 智能指針(unique_ptr、shared_ptr、weak_ptr)的差別?
unique_ptr
如名字所示,
unique_ptr
是個獨占指針,C++ 11之前就已經存在,
unique_ptr
所指的記憶體為自己獨有,某個時刻隻能有一個
unique_ptr
指向一個給定的對象,不支援拷貝和指派。
shared_ptr
shared_ptr允許多個該智能指針共享“擁有”同一堆配置設定對象的記憶體,這通過引用計數(reference counting)實作,會記錄有多少個shared_ptr共同指向一個對象,一旦最後一個這樣的指針被銷毀,也就是一旦某個對象的引用計數變為0,這個對象會被自動删除。支援複制和指派操作。
weak_ptr
weak_ptr是為配合shared_ptr而引入的一種智能指針來協助shared_ptr工作,它可以從一個shared_ptr或另一個weak_ptr對象構造,它的構造和析構不會引起引用計數的增加或減少。沒有重載 *和 -> 但可以使用lock獲得一個可用的shared_ptr對象
weak_ptr的使用更為複雜一點,它可以指向shared_ptr指針指向的對象記憶體,卻并不擁有該記憶體,而使用weak_ptr成員lock,則可傳回其指向記憶體的一個share_ptr對象,且在所指對象記憶體已經無效時,傳回指針空值nullptr。
注意:weak_ptr并不擁有資源的所有權,是以不能直接使用資源。 可以從一個weak_ptr構造一個shared_ptr以取得共享資源的所有權。
2. const int *a和int *const a的差別
1)const int *a
這裡const 修飾的是int,而int定義的是一個整值
是以*a 所指向的對象值不能通過 *a 來修改,但是可以重新給 a 來指派,使其指向不同的對象。
eg:
const int *a = 0;
const int b = 1;
int c = 1;
a = &b // 額外:注意不能通過a來修改 b值
a = &c // 額外:雖然c本身不是一個常量
*a = 2 //error 為題就在這裡,不能修改通過 *a 所指向的對象值,最後指派得對象是c,是以不能通過*a 來修改c值。
2)int *const a
這裡const修飾的是 a ,a代表的是一個指針位址
是以不能賦給a其他的位址值,但可以修改a指向的值。
至于int const *a 和 const int *a 的意義是相同的,作用等價。
補充:
3)const int * const a
這個代表a所指向的對象的值以及它的位址本身都不能被改變
4) const int *const a
a所指向的對象及對象的值均不可改變。
關于const的點滴補充:
1、const 對象的位址隻能指派給指向const 對象的指針
2、指向const 對象的指針可以 被賦 以 一個非const 對象的位址
3、指向const 得指針常被用作函數的形式參數,保證被傳遞給函數的實際對象在函數得實際對象在函數中不會被修改
4、常量在定義後就不能被修改,是以它必須被初始化。未初始化的常量定義将導緻編譯錯誤(上面都是在說明const得問題,是以沒有指派,實際語句中要指派的)