變數要初始化,初始化盡量使用初始化列表。如果不初始化,變數的值是隨機不確定的。
class
point
;// 改進之後後
class
point
private
:int _x;
int _y;
};
私有析構函式,類物件不能在棧上分配空間.只能在堆上分配,但不能delete直接釋放。
#include
using
namespace std;
class
point
void
destory()
private:~
point()
private
:int _x;
int _y;};
intmain
(int argc,
char
const
*ar**)
遮蔽new和delete, 物件只能在棧上分配
#include
using
namespace std;
class
point
point
(int x,
int y):_x
(x),
_y(y)
// 刪除或者私有new 和 delete
void
*operator
new(size_t size)
=delete
;void
operator
delete
(void
* ptr)
=delete
;// private:
// void* operator new(size_t size);
// void operator delete(void* ptr);
private
:int _x;
int _y;};
intmain
(int argc,
char
const
* ar**)
多型基類宣告為虛析構函式,否則可能會導致記憶體洩漏,繼承類獨有的記憶體未能被釋放。**如下
反之,不要設定虛析構函式,導致冗餘記憶體。
#include
using
namespace std;
class
base
~base()
private
:char
* a;};
class
derived
:public base
~derived()
private
:char
* b;};
intmain
(int argc,
char
const
* ar**)
output:
[root@localhost poco_demo]
# g++ tt.cpp -std=c++11 -o tt
[root@localhost poco_demo]
# ./tt
~base
不要在析構函式中丟擲異常,這樣可能會導致記憶體無法釋放等錯誤。正確的做法是,捕獲並處理掉這些錯誤,讓析構正常結束,而不是一層層丟擲。
不要再析構和建構函式,使用虛函式。虛函式是通過虛函式表控制,類通過虛函式表指標,訪問虛函式表。虛函式表指標作為乙個成員變數,在構造時初始化,析構時結束生命週期。在繼承體系中,這樣做會更混亂。
不要私有乙個虛函式,因為這沒什麼意義。只要拿到_vptr,就可以訪問虛函式表,進而繞過private訪問虛函式。
析構函式和建構函式的注意事項
1建構函式 在c 中,使用建構函式來實現物件的初始化。建構函式的特點 1 建構函式無需呼叫,建立物件時自動執行。2 建構函式的名稱必須與類名相同,不能隨意起名 不同以初始化函式,雖然和其功能相同 3 建構函式沒有返回值。4 如果程式者沒有自定義建構函式,系統會自動呼叫預設的建構函式。5 如果程式者自...
關於使用析構函式的幾點注意事項
析構函式為你提供了一種機制,可以讓你在系統釋放物件前做一些善後工作,如清理記憶體,釋放空間等。但是在以下兩個方面使用虛構函式時要尤為注意。1.多型性 具有多型性質的base classes的析構函式應該為virture,或者說任何帶有virture函式的class都應該有virture析構函式。考慮...
c 建構函式和析構函式丟擲異常的注意事項
從語法上來說,建構函式和析構函式都可以丟擲異常。但從邏輯上和風險控制上,建構函式和析構函式中盡量不要丟擲異常,萬不得已,一定要注意防止資源洩露。在析構函式中丟擲異常還要注意棧展開帶來的程式崩潰。1.建構函式中丟擲異常 在c 建構函式中,既需要分配記憶體,又需要丟擲異常時要特別注意防止記憶體洩露的情況...