1. 程式人生 > 其它 >顯示呼叫C++中建構函式和解構函式(有什麼弊端)

顯示呼叫C++中建構函式和解構函式(有什麼弊端)

1、C++中, 建構函式和解構函式可以被顯示呼叫.
顯示呼叫預設建構函式的語法: a.A::A();(不能寫成a.A();) , 顯示呼叫非預設建構函式的語法: a.A::A(7);(不能寫成a.A(7);); 顯示呼叫解構函式的語法: a.A::~A();(可以寫成a.~A();) 。

2、顯示呼叫建構函式和解構函式就像呼叫一般的函式一樣, 並不意味著建立或銷燬物件。

3、如果建構函式中動態分配了空間, 則顯示呼叫建構函式會造成記憶體洩露. 建立物件時的隱式建構函式呼叫已經為物件分配了動態記憶體,當用建立好的物件顯示呼叫建構函式時, 物件指向的動態記憶體更新為顯示呼叫時所分配的, 物件生命週期結束時解構函式所釋放掉的是後一次分配的動態記憶體, 也就是說建立物件時隱式建構函式呼叫所分配的那塊記憶體洩漏了。

4、如果解構函式中釋放動態分配的空間, 則會造成多次釋放同一記憶體, 會出現嚴重錯誤。

    #include <iostream>  
    using namespace std;  
    class A  
    {  
    public:  
        A()  
        {  
            cout << "Default constructor is called./r/n";  
        }  
        A(int ix)  
        {  
            cout << "
Another constructor is called./r/n"; } ~A() { cout << "Destructor is called./r/n"; } }; int main() { A a1; // <1> a1.A::A(); // <2> 顯示呼叫預設建構函式(寫成a1.A()會報錯) a1.A::A(7); // <3> 顯示呼叫非預設建構函式(寫成a1.A(7)會報錯)
a1.A::~A(); // <4> 顯示呼叫解構函式, 但是此時物件a1並沒有銷燬(寫成a1.~A()不會報錯) // A a2(); // 這樣寫沒報錯, 但也沒呼叫任何建構函式和解構函式. A a3 = A(); // <5> 完整寫法: A a3 = A::A(); A a4(77); // <6> A a5 = A(777); // <7> 完整寫法: A a5 = A::A(777); return 0;// <8>, <9>, <10>, <11> return語句之後, 右括號之前解構函式被隱式呼叫. a1, a3, a4, a5物件在這裡被銷燬. }
我們嚮往遠方,卻忽略了此刻的美麗