C++中的六個(gè)函數(shù)
一、構(gòu)造函數(shù)
在C++中,構(gòu)造函數(shù)是六個(gè)函數(shù)中的第一個(gè),當(dāng)一個(gè)對(duì)象被創(chuàng)建時(shí),在它的整個(gè)周期中,是一個(gè)由生到死的過(guò)程,即構(gòu)造函數(shù)創(chuàng)建對(duì)象,析構(gòu)函數(shù)析構(gòu)對(duì)象。在對(duì)象被創(chuàng)建時(shí),調(diào)用構(gòu)造函數(shù)創(chuàng)建一個(gè)對(duì)象,這是對(duì)象的創(chuàng)建過(guò)程。在C++中,當(dāng)你創(chuàng)建一個(gè)對(duì)象時(shí)需要調(diào)用構(gòu)造函數(shù)創(chuàng)建對(duì)象,在類中,有默認(rèn)的構(gòu)造函數(shù),當(dāng)然你也可以去使用構(gòu)造函數(shù)去創(chuàng)建對(duì)象,對(duì)數(shù)據(jù)進(jìn)行初始化??聪旅娴睦樱?/p>
class Base
{
public:
Base()
{}
Base(int a=0):num(a)
{}
Base(int a=0,int b=0):num(a),age(b)
{}
Base(int a=0,int b=0,double c=0.0):num(a),age(b),slaroy(c)
{}
private:
int num;
int age;
double slaroy;
};
在上面的構(gòu)造函數(shù)中,構(gòu)造函數(shù)必須與類名相同,構(gòu)造函數(shù)是無(wú)類型的,第一個(gè)構(gòu)造函數(shù)是默認(rèn)的構(gòu)造函數(shù),第二個(gè)構(gòu)造函數(shù)是只對(duì)一個(gè)數(shù)據(jù)成員進(jìn)行初始化,其它的數(shù)據(jù)成員是隨機(jī)值。第二個(gè)構(gòu)造函數(shù)是對(duì)兩個(gè)數(shù)據(jù)成員進(jìn)行初始化,其它的數(shù)據(jù)成員為隨機(jī)值。第三個(gè)構(gòu)造函數(shù)是對(duì)所有的數(shù)據(jù)成員進(jìn)行初始化。
二、析構(gòu)函數(shù)
在C++中,構(gòu)造函數(shù)是創(chuàng)建一個(gè)對(duì)象時(shí),那么析構(gòu)函數(shù)則是這個(gè)對(duì)象由生到死的死亡過(guò)程。同時(shí)析構(gòu)函數(shù)也在析構(gòu)對(duì)象時(shí)可以將已經(jīng)分配的內(nèi)存空間進(jìn)行回收。
class Base
{
public:
Base()
{}
Base()
{
p= new char[strlen("default")+1];
strcpy(p,"default");
}
~Base()
{
if(p != NULL)
{
delete[] p;
p=NULL;
}
}
private:
char *p;
};
析構(gòu)函數(shù)如上所示,它無(wú)類型、無(wú)參數(shù)、無(wú)返回值,如果在構(gòu)造對(duì)象時(shí)沒(méi)有進(jìn)行空間的開(kāi)辟內(nèi)存的分配時(shí),那么
析構(gòu)函數(shù)如同默認(rèn)的析構(gòu)函數(shù)一樣,如果進(jìn)行了內(nèi)存的分配時(shí),當(dāng)一個(gè)對(duì)象被析構(gòu)時(shí)同時(shí)還要對(duì)其所分配的內(nèi)存進(jìn)行回收,否則就會(huì)造成內(nèi)存泄漏。
三、拷貝構(gòu)造函數(shù)
在C++中,如果在構(gòu)造函數(shù)中有申請(qǐng)內(nèi)存的操作,且在其他函數(shù)中出現(xiàn)對(duì)象的拷貝,那么就會(huì)需要拷貝構(gòu)造函數(shù)。
class Base
{
public:
Base()
{}
Base()
{
p= new char[strlen("default")+1];
strcpy(p,"default");
}
Base(const Base &s)
{
p= new char[strlen(s.p)+1];
strcpy(p,s.p);
}
~Base()
{
if(p != NULL)
{
delete[] p;
p=NULL;
}
}
private:
char *p;
};
int main()
{
Base a;
Base b(a);
return 0;
}
由于在主函數(shù)中出現(xiàn)了對(duì)對(duì)象的拷貝賦值,那么就需要拷貝構(gòu)造函數(shù),如果沒(méi)有拷貝構(gòu)造函數(shù),則會(huì)使用默認(rèn)的
拷貝構(gòu)造函數(shù),那么此時(shí)進(jìn)行的是淺拷貝,那么會(huì)產(chǎn)生析構(gòu)函數(shù)對(duì)內(nèi)存重復(fù)釋放的錯(cuò)誤。那么此時(shí)就需要進(jìn)行深拷貝
操作,重新編寫拷貝構(gòu)造函數(shù)對(duì)對(duì)象進(jìn)行拷貝賦值。而在編寫拷貝構(gòu)造函數(shù)時(shí)要注意參數(shù)必須是“&”引用傳遞,否則
則是語(yǔ)法錯(cuò)誤。
四、賦值函數(shù)
在C++中,賦值函數(shù)為第四個(gè)函數(shù),如果在構(gòu)造函數(shù)中有申請(qǐng)內(nèi)存的操作,且在其他程序中有兩個(gè)對(duì)象直接或間接
進(jìn)行賦值操作,就需要賦值函數(shù)。
class Base
{
public:
Base()
{}
Base()
{
p= new char[strlen("default")+1];
strcpy(p,"default");
}
Base(const Base &s)
{
p= new char[strlen(s.p)+1];
strcpy(p,s.p);
}
Base& operator=(const Base &s)
{
if(&s==this)
return *this;
delete[] p;
p= new char[strlen(s.p)+1];
strcpy(p,s.p);
return *this;
}
~Base()
{
if(p != NULL)
{
delete[] p;
p=NULL;
}
}
private:
char *p;
};
int main()
{
Base a,c;
Base b(a);
c=a;
return 0;
}
由于在主函數(shù)中進(jìn)行了對(duì)象的賦值操作,如果沒(méi)有對(duì)“=”運(yùn)算符進(jìn)行重載定義,則會(huì)產(chǎn)生兩次釋放同一個(gè)內(nèi)存的
操作的錯(cuò)誤。在“=”重載操作中,如果涉及到指針操作,則必須判斷兩個(gè)對(duì)象是否為同一個(gè)對(duì)象即自賦值操作,否則
當(dāng)進(jìn)行釋放指針的操作時(shí),就可能產(chǎn)生錯(cuò)誤。然后要用delete釋放原有的內(nèi)存資源,否則將造成內(nèi)存泄漏。
五、對(duì)一般對(duì)象的取址函數(shù)
在C++中,對(duì)一般對(duì)象的取址函數(shù)為第五個(gè)函數(shù)。
class Base
{
public:
Base* operator&()
{
return this;
}
};
在一般對(duì)象的取址函數(shù)是直接返回該對(duì)象的地址,則為取其地址。
六、對(duì)常對(duì)象的取址函數(shù)
在C++中,對(duì)常對(duì)象的取址函數(shù)為第六個(gè)函數(shù)。
class Base
{
public:
const Base* operator&() const
{
return this;
}
};
在常對(duì)象的取址函數(shù)也是直接返回該常對(duì)象的地址,則為取其地址。
上一篇:C++中異常機(jī)制的實(shí)現(xiàn)機(jī)制詳解
欄 目:C語(yǔ)言
下一篇:visual studio 建立dll類型工程、控制臺(tái)程序
本文標(biāo)題:C++中的六個(gè)函數(shù)
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/780.html
您可能感興趣的文章
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開(kāi)原生自帶讀寫NTFS功能(圖文
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置


