詳解C++何時(shí)需要拷貝構(gòu)造函數(shù)
何時(shí)需要拷貝函數(shù)?
下面我們看一段代碼?
#include <iostream> using namespace std; class Line { public: string m_name; int m_age; Line(); ~Line(); // 析構(gòu)函數(shù) void show(); }; Line:: Line() { cout << "無(wú)參構(gòu)造被調(diào)用" << endl; } Line:: ~Line() { cout << "析構(gòu)函數(shù)~Line()被調(diào)用" << endl; } void Line:: show() { cout << "姓名:" << m_name << ",年齡: " << m_age << endl; } int main() { Line line1("張三", 18); Line line2 = line1; return 0; }
這時(shí)候編譯,會(huì)提示你
已經(jīng)告訴你答案了。
拷貝構(gòu)造函數(shù)的規(guī)則
拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),它在創(chuàng)建對(duì)象時(shí),是使用同一類(lèi)中之前創(chuàng)建的對(duì)象來(lái)初始化新創(chuàng)建的對(duì)象。
用一個(gè)已存在的對(duì)象創(chuàng)建新的對(duì)象,不會(huì)調(diào)用(普通)構(gòu)造函數(shù),而是調(diào)用拷貝構(gòu)造函數(shù)。
如果類(lèi)中沒(méi)有定義拷貝構(gòu)造函數(shù),編譯器將提供一個(gè)拷貝構(gòu)造函數(shù),它的功能是把已存在對(duì)象的成員變量賦值給新的對(duì)象的成員變量。
用一個(gè)已存在的對(duì)象創(chuàng)建新的對(duì)象語(yǔ)法:
- 類(lèi)名 新對(duì)象名(已存在的對(duì)象名)
Line line1("張三", 18);
Line line2(line1);
- 類(lèi)名 新對(duì)象名 = 已存在的對(duì)象名。
Line line1("張三", 18);
Line line2 = line1;
拷貝構(gòu)造函數(shù)的寫(xiě)法
classname (const classname &obj) { // 構(gòu)造函數(shù)的主體 }
接下來(lái)把上面的例子補(bǔ)齊
#include <iostream> using namespace std; class Line { public: string m_name; int m_age; Line(); Line(string name, int age); // 構(gòu)造函數(shù) Line(const Line &obj); Line(const Line &obj, int n); ~Line(); // 析構(gòu)函數(shù) void show(); }; Line:: Line() { cout << "無(wú)參構(gòu)造被調(diào)用" << endl; } Line:: Line(string name, int age) { m_name = name; m_age = age; cout << "構(gòu)造函數(shù)Line(string name1, int age)被調(diào)用" << endl; } Line:: Line(const Line &obj) { cout << "拷貝構(gòu)造函數(shù)被調(diào)用" << endl; cout << "拷貝構(gòu)造 - 姓名:" << obj.m_name << ",拷貝構(gòu)造 - 年齡: " << obj.m_age << endl; m_name = obj.m_name; m_age = obj.m_age; } Line:: ~Line() { cout << "析構(gòu)函數(shù)~Line()被調(diào)用" << endl; } // 實(shí)現(xiàn)成員函數(shù) void Line:: show() { cout << "姓名:" << m_name << ",年齡: " << m_age << endl; } int main() { Line line1("張三", 18); Line line2 = line1; line2.show(); return 0; }
執(zhí)行結(jié)果如下:
到此這篇關(guān)于詳解C++何時(shí)需要拷貝構(gòu)造函數(shù)的文章就介紹到這了,更多相關(guān)c++ 拷貝構(gòu)造函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VC++6.0實(shí)現(xiàn)直線掃描轉(zhuǎn)換的圖文教程
這篇文章主要給大家介紹了關(guān)于VC++6.0實(shí)現(xiàn)直線掃描轉(zhuǎn)換的相關(guān)資料,文中通過(guò)圖文將實(shí)現(xiàn)的步驟一步步介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用VC++6.0具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-01-01基于VC中使用ForceInclude來(lái)強(qiáng)制包含stdafx.h的解決方法
本篇文章是對(duì)VC中使用ForceInclude來(lái)強(qiáng)制包含stdafx.h的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++中浮點(diǎn)數(shù)、double類(lèi)型如何與0值作比較詳解
浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)機(jī)制和整型數(shù)不同,其有舍入誤差,在計(jì)算機(jī)中用近似表示任意某個(gè)實(shí)數(shù),這篇文章主要介紹了C++中浮點(diǎn)數(shù)、double類(lèi)型如何與0值作比較的相關(guān)資料,需要的朋友可以參考下2025-03-03C++訪問(wèn)者模式模板函數(shù)無(wú)法重載的問(wèn)題解決
本文主要介紹了C++訪問(wèn)者模式模板函數(shù)無(wú)法重載的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12OpenCV實(shí)現(xiàn)車(chē)牌定位(C++)
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)車(chē)牌定位,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11C++入門(mén)概覽和嘗試創(chuàng)建第一個(gè)C++程序
這篇文章主要介紹了C++入門(mén)概覽和嘗試創(chuàng)建第一個(gè)C++程序,同時(shí)也包括編寫(xiě)類(lèi)的示例展示C++面向?qū)ο蟮奶匦?需要的朋友可以參考下2015-09-09C++11中初始化列表initializer lists的使用方法
C++11引入了初始化列表來(lái)初始化變量和對(duì)象,自定義類(lèi)型,如果想用初始化列表就要包含initializer_list頭文件2021-09-09