練習13.9:
創(chuàng)新互聯(lián)憑借在網(wǎng)站建設、網(wǎng)站推廣領域領先的技術能力和多年的行業(yè)經(jīng)驗,為客戶提供超值的營銷型網(wǎng)站建設服務,我們始終認為:好的營銷型網(wǎng)站就是好的業(yè)務員。我們已成功為企業(yè)單位、個人等客戶提供了成都做網(wǎng)站、網(wǎng)站設計服務,以良好的商業(yè)信譽,完善的服務及深厚的技術力量處于同行領先地位。析構函數(shù)執(zhí)行與構造函數(shù)相反的操作:構造函數(shù)初始化對象的非static數(shù)據(jù)成員,還可能做一些其他工作;析構函數(shù)釋放對象使用的資源,并銷毀對象的非static數(shù)據(jù)成員
析構函數(shù)是類的成員函數(shù),名字由波浪線接類名構成,它沒有返回值,不接受參數(shù)
類似拷貝構造函數(shù)和拷貝賦值運算符,對于某些類,合成析構函數(shù)用來阻止該類型的對象被銷毀,如果不是這種情況,合成析構函數(shù)的函數(shù)體就為空
當一個類未定義自己的析構函數(shù)時,編譯器會為它定義一個合成析構函數(shù)
練習13.10:
StrBlob類和StrBlobPtr類沒有定義析構函數(shù),編譯器會為這兩個類定義合成析構函數(shù)。
StrBlob對象銷毀時,在合成析構函數(shù)的空函數(shù)體執(zhí)行完畢后,會進行隱含析構階段,此時會將數(shù)據(jù)成員data銷毀,調(diào)用shared_ptr的析構函數(shù)。引用計數(shù)減1,減為0后釋放內(nèi)存
StrBlobPtr對象銷毀時,在合成析構函數(shù)的空函數(shù)體執(zhí)行完畢后,會進行隱含析構階段,此時會將數(shù)據(jù)成員wptr和curr銷毀,調(diào)用weak_ptr的析構函數(shù)銷毀wptr。引用計數(shù)不變,curr是內(nèi)置數(shù)據(jù)類型,直接銷毀
練習13.11:
#include#includeusing namespace std;
class HasPtr
{
public:
HasPtr(const std::string& s = std::string()):
ps(new std::string(s)),i(0) { }
//拷貝構造函數(shù)
HasPtr(const HasPtr& hp): ps(new std::string(*hp.ps)),i(hp.i) { }
//拷貝賦值運算符
HasPtr& operator=(const HasPtr&);
//析構函數(shù)
~HasPtr() { }
private:
std::string* ps;
int i;
};
HasPtr& HasPtr::operator=(const HasPtr& ptr)
{
delete ps;
ps = new string(*ptr.ps);
i = ptr.i;
return *this;
}
練習13.12:
會發(fā)生三次析構操作
函數(shù)執(zhí)行結束時,臨時變量item1和item2被銷毀,執(zhí)行析構函數(shù)
函數(shù)結束后,非引用形參accum被銷毀,執(zhí)行析構函數(shù)
練習13.13:
#include#includeusing namespace std;
#includeclass HasPtr
{
public:
HasPtr(const std::string& s = std::string()):
ps(new std::string(s)),i(0) { }
//拷貝構造函數(shù)
HasPtr(const HasPtr& hp): ps(new std::string(*hp.ps)),i(hp.i) { }
//拷貝賦值運算符
HasPtr& operator=(const HasPtr&);
//析構函數(shù)
~HasPtr() { }
private:
std::string* ps;
int i;
};
HasPtr& HasPtr::operator=(const HasPtr& ptr)
{
delete ps;
ps = new string(*ptr.ps);
i = ptr.i;
return *this;
}
struct X {
//默認構造
X() { std::cout<< "X()"<< std::endl; }
//拷貝構造
X(const X&) { std::cout<< "X(const X&)"<< std::endl; }
//拷貝賦值運算符
X& operator=(const X& x)
{
std::cout<< "X& operator=(const X& x)"<< std::endl;
return *this;
}
//析構函數(shù)
~X() { std::cout<< "~X()"<< std::endl; }
};
void func(X x)
{
}
int main()
{
//創(chuàng)建X對象
X x;
//非引用參數(shù)傳遞
func(x);
//引用參數(shù)傳遞
X x1(x);
//動態(tài)分配
X* x2 = new X;
//存放于容器
vectorv;
v.push_back(x);
system("pause");
return 0;
}
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧