国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當前位置: 首頁 > news >正文

做槍版電影網(wǎng)站賺錢免費二級域名平臺

做槍版電影網(wǎng)站賺錢,免費二級域名平臺,天津哪里建網(wǎng)站好,炫酷網(wǎng)站推薦介紹和示例 拷貝構造函數(shù)是一種特殊的構造函數(shù),它在創(chuàng)建對象時,是使用同一類中之前創(chuàng)建的對象來初始化新創(chuàng)建的對象??截悩嬙旌瘮?shù)通常用于: 通過使用另一個同類型的對象來初始化新創(chuàng)建的對象。 復制對象把它作為參數(shù)傳遞給函數(shù)。 復制對象…

介紹和示例

拷貝構造函數(shù)是一種特殊的構造函數(shù),它在創(chuàng)建對象時,是使用同一類中之前創(chuàng)建的對象來初始化新創(chuàng)建的對象??截悩嬙旌瘮?shù)通常用于:

  • 通過使用另一個同類型的對象來初始化新創(chuàng)建的對象。

  • 復制對象把它作為參數(shù)傳遞給函數(shù)。

  • 復制對象,并從函數(shù)返回這個對象。

如果在類中沒有定義拷貝構造函數(shù),編譯器會自行定義一個。如果類帶有指針變量,并有動態(tài)內存分配,則它必須有一個拷貝構造函數(shù)??截悩嬙旌瘮?shù)的最常見形式如下:

//在這里,obj 是一個對象引用,該對象是用于初始化另一個對象的。
classname (const classname &obj) {// 構造函數(shù)的主體
}

示例:

#include <iostream>using namespace std;class Line
{public:int getLength( void );Line( int len );             // 簡單的構造函數(shù)Line( const Line &obj);      // 拷貝構造函數(shù)~Line();                     // 析構函數(shù)private:int *ptr;
};// 成員函數(shù)定義,包括構造函數(shù)
Line::Line(int len)
{cout << "調用構造函數(shù)" << endl;// 為指針分配內存ptr = new int;*ptr = len;
}Line::Line(const Line &obj)
{cout << "調用拷貝構造函數(shù)并為指針 ptr 分配內存" << endl;ptr = new int;*ptr = *obj.ptr; // 拷貝值
}Line::~Line(void)
{cout << "釋放內存" << endl;delete ptr;
}
int Line::getLength( void )
{return *ptr;
}void display(Line obj)
{cout << "line 大小 : " << obj.getLength() <<endl;
}// 程序的主函數(shù)
int main( )
{Line line(10);display(line);return 0;
}

編譯執(zhí)行結果:

下面的實例對上面的實例稍作修改,通過使用已有的同類型的對象來初始化新創(chuàng)建的對象:

#include <iostream>using namespace std;class Line
{public:int getLength( void );Line( int len );             // 簡單的構造函數(shù)Line( const Line &obj);      // 拷貝構造函數(shù)~Line();                     // 析構函數(shù)private:int *ptr;
};// 成員函數(shù)定義,包括構造函數(shù)
Line::Line(int len)
{cout << "調用構造函數(shù)" << endl;// 為指針分配內存ptr = new int;*ptr = len;
}Line::Line(const Line &obj)
{cout << "調用拷貝構造函數(shù)并為指針 ptr 分配內存" << endl;ptr = new int;*ptr = *obj.ptr; // 拷貝值
}Line::~Line(void)
{cout << "釋放內存" << endl;delete ptr;
}
int Line::getLength( void )
{return *ptr;
}void display(Line obj)
{cout << "line 大小 : " << obj.getLength() <<endl;
}// 程序的主函數(shù)
int main( )
{Line line1(10);Line line2 = line1; // 這里也調用了拷貝構造函數(shù)display(line1);display(line2);return 0;
}

編譯執(zhí)行結果:

拷貝構造函數(shù)幾個原則:

拷貝構造函數(shù)是一種特殊的構造函數(shù),具有單個形參,該形參(常用const修飾)是對該類類型的引用。當定義一個新對象并用一個同類型的對象對它進行初始化時,將顯示使用拷貝構造函數(shù)。當該類型的對象傳遞給函數(shù)或從函數(shù)返回該類型的對象時,將隱式調用拷貝構造函數(shù)。

C++支持兩種初始化形式:

拷貝初始化?int a = 5;?和直接初始化?int a(5);?對于其他類型沒有什么區(qū)別,對于類類型直接初始化直接調用實參匹配的構造函數(shù),拷貝初始化總是調用拷貝構造函數(shù),也就是說:

A x(2);  //直接初始化,調用構造函數(shù)
A y = x;  //拷貝初始化,調用拷貝構造函數(shù)

必須定義拷貝構造函數(shù)的情況:

只包含類類型成員或內置類型(但不是指針類型)成員的類,無須顯式地定義拷貝構造函數(shù)也可以拷貝;有的類有一個數(shù)據(jù)成員是指針,或者是有成員表示在構造函數(shù)中分配的其他資源,這兩種情況下都必須定義拷貝構造函數(shù)。

什么情況使用拷貝構造函數(shù):

類的對象需要拷貝時,拷貝構造函數(shù)將會被調用。以下情況都會調用拷貝構造函數(shù):

  • (1)一個對象以值傳遞的方式傳入函數(shù)體
  • (2)一個對象以值傳遞的方式從函數(shù)返回
  • (3)一個對象需要通過另外一個對象進行初始化。

關于為什么當類成員中含有指針類型成員且需要對其分配內存時,一定要有總定義拷貝構造函數(shù)??

默認的拷貝構造函數(shù)實現(xiàn)的只能是淺拷貝,即直接將原對象的數(shù)據(jù)成員值依次復制給新對象中對應的數(shù)據(jù)成員,并沒有為新對象另外分配內存資源。

這樣,如果對象的數(shù)據(jù)成員是指針,兩個指針對象實際上指向的是同一塊內存空間。

在某些情況下,淺拷貝回帶來數(shù)據(jù)安全方面的隱患。

當類的數(shù)據(jù)成員中有指針類型時,我們就必須定義一個特定的拷貝構造函數(shù),該拷貝構造函數(shù)不僅可以實現(xiàn)原對象和新對象之間數(shù)據(jù)成員的拷貝,而且可以為新的對象分配單獨的內存資源,這就是深拷貝構造函數(shù)。

如何防止默認拷貝發(fā)生

聲明一個私有的拷貝構造函數(shù),這樣因為拷貝構造函數(shù)是私有的,如果用戶試圖按值傳遞或函數(shù)返回該類的對象,編譯器會報告錯誤,從而可以避免按值傳遞或返回對象。

總結:

當出現(xiàn)類的等號賦值時,會調用拷貝函數(shù),在未定義顯示拷貝構造函數(shù)的情況下,系統(tǒng)會調用默認的拷貝函數(shù)——即淺拷貝,它能夠完成成員的一一復制。當數(shù)據(jù)成員中沒有指針時,淺拷貝是可行的。但當數(shù)據(jù)成員中有指針時,如果采用簡單的淺拷貝,則兩類中的兩個指針將指向同一個地址,當對象快結束時,會調用兩次析構函數(shù),而導致指針懸掛現(xiàn)象。所以,這時,必須采用深拷貝。

深拷貝與淺拷貝的區(qū)別就在于深拷貝會在堆內存中另外申請空間來儲存數(shù)據(jù),從而也就解決了指針懸掛的問題。簡而言之,當數(shù)據(jù)成員中有指針時,必須要用深拷貝。

http://m.aloenet.com.cn/news/41302.html

相關文章:

  • 臺前做網(wǎng)站的公司廣告文案
  • 推廣普通話宣傳周活動方案長沙seo免費診斷
  • 制作一個網(wǎng)站需要什么推廣合作
  • 佛山網(wǎng)站建設公司88百度的鏈接
  • dede的網(wǎng)站地圖要怎么做網(wǎng)站推廣平臺
  • 同一個服務器可以做多個網(wǎng)站百度收錄規(guī)則
  • 論壇網(wǎng)站html模板廣州aso優(yōu)化公司 有限公司
  • 網(wǎng)站建設請示文件茶葉網(wǎng)絡營銷策劃方案
  • 地下城釣魚網(wǎng)站怎么做營銷網(wǎng)站建設軟件下載
  • php網(wǎng)站開發(fā)常用的插件seo排名賺app最新版本
  • 做齊魯油官方網(wǎng)站軟件推廣平臺有哪些
  • 視頻音樂網(wǎng)站怎樣建設濰坊seo培訓
  • 徐州建站服務av手機在線精品
  • 上海專業(yè)網(wǎng)站建設 公司中國站免費推廣入口
  • 教育部教育考試院網(wǎng)站網(wǎng)頁的優(yōu)化方法
  • 建設部繼續(xù)教育網(wǎng)站網(wǎng)站制作方案
  • 攜程旅行網(wǎng)站內容的建設軟文發(fā)布軟件
  • 抖音app下載seo外包方法
  • 如何請人創(chuàng)建一個網(wǎng)站信息流廣告素材網(wǎng)站
  • 做淘寶需要的網(wǎng)站數(shù)字化營銷
  • 直播app開發(fā)一個需要多少錢整站優(yōu)化報價
  • 網(wǎng)頁制作要多少錢長沙seo工作室
  • 網(wǎng)站外包合作網(wǎng)絡優(yōu)化報告
  • 鄭州做網(wǎng)站齒輪廣州網(wǎng)絡營銷選擇
  • 餐飲公司網(wǎng)站建設策劃書網(wǎng)絡營銷管理
  • 科汛kesioncms網(wǎng)站系統(tǒng)長春百度網(wǎng)站優(yōu)化
  • 商融建設集團有限公司網(wǎng)站廣州網(wǎng)站seo推廣
  • wordpress模版怎么上傳寧波關鍵詞優(yōu)化企業(yè)網(wǎng)站建設
  • 西安做網(wǎng)站公無憂seo博客
  • 做網(wǎng)站需要學習多久域名被墻查詢