構造,析構,拷貝【類和對象(中)】

P. S.:以下代碼均在VS2019環境下測試,不代表所有編譯器均可通過。
P. S.:測試代碼均未展示頭文件stdio.h的聲明,使用時請自行添加。

??

在這里插入圖片描述

???????????????????????????????????????????博主主頁:LiUEEEEE
??????????????????? ????????????????????????????C++專欄
??????????????????? ??????????????????????????C語言專欄
????????????????????????????????????????????數據結構專欄
????????????????????????????????????????????排序算法專欄
?????????????????????????????????????????力扣牛客經典題目專欄

目錄

  • 1、前言
  • 2、構造函數
  • 3、構造函數
  • 4、拷貝函數
  • 5、結語

1、前言


??在C++中,類擁有六個默認成員函數(使用者如果沒有顯式實現此函數,在C++編譯過程中編譯器也會自動生成),如下:

在這里插入圖片描述
??本文主要講述其中的三個默認成員函數,分別為構造函數,析構函數,和拷貝構造函數,下面進入正文。



2、構造函數


??例如Data類,其構造函數如下所示:
class Data
{
public://方法1Data(){_year = 1;_month = 1;_day = 1;}//方法2Data(int year, int month, int day){_year = year;_month = month;_day = day;}//方法3Data(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};

??根據代碼塊所示,構造函數的目的就是為了將類中成員變量的值進行初始化,而代碼塊中所展示了三種不同的寫法,展示了構造函數的特征:

  1. 函數名與類名相同。
  2. 無返回值。
  3. 對象實例化時編譯器自動調用對應的構造函數。
  4. 構造函數可以重載。

??方法3的使用方式為,在創建類對象時,在對象后傳入想要初始化的值,例如:

	Data data(2024, 7, 2);

??而作為無參的初始化類成員,將默認調用無參數的構造函數,正如上文中提及的特征3一樣。

??值得注意的是,即使構造函數可以重載,以應對不同的初始化要求,但代碼塊中所展示的方法3和方法1不可以同時出現,因為當使用者創建類時:

	Data data;

??
??編譯器會去類中尋找使用者顯式實現的無參類型構造函數,但對于全缺省類型的構造函數也可以不傳遞參數進行類對象的創建,此時編譯器就出現了調用沖突,不知道使用者想調用的構造函數是哪一個。


??在C++中,如果使用者沒有顯式實現構造函數,那么C++默認生成的構造函數在調用時并不會對內置類型(編譯器中自帶的類型:int , double , char 等)進行初始化(主要取決于編譯器,在最新版編譯器中可能會將相關成員變量初始化為特定的值),但對于自定義類型,會調用其無參的構造函數(例如:全缺省的構造函數,無參的構造函數,編譯器自動生成的構造函數。 注意以上三種無參構造函數在類中只能存在一個)。
??演示如下:
class Data
{
public:void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};int main()
{Data data;data.Print();return 0;
}

在這里插入圖片描述




3、構造函數


??對于析構函數,同樣以Data類為例,析構函數的功能與構造函數相反,析構函數不是完成對對象本身的銷毀,局部對象的銷毀工作是由編譯器完成的,而對象在銷毀時會自動調用析構函數,完成對象中資源的清理,類似于在實現棧時的Destroy函數。
??析構函數的特征:
  1. 析構函數名是在類名前加上字符 “ ~ ”。
  2. 無參數無返回值類型。
  3. 一個類只能有一個析構函數。若未顯式定義,系統會自動生成默認的析構函數。注意:析構
    函數不能重載
  4. 對象生命周期結束時,C++編譯系統系統自動調用析構函數。

??樣例如下
class Data
{
public:Data(int year = 2024,int month = 7,int day = 2){_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}~Data(){cout << "~Data()" << endl;_year = 1;_month = 1;_day = 1;}
private:int _year;int _month;int _day;
};int main()
{Data data;data.Print();return 0;
}

??因為編譯器在生命周期結束時自動調用析構函數,故上述代碼塊中在析構函數中添加了打印語句“ cout << “~Data()” << endl; ”,其打印結果如下:
在這里插入圖片描述
??可以明確的看到編譯器確實調用了析構函數。

??同樣的,析構函數在調用時不會對內置類型進行處理,對自定義類型的對象會調用其自己的析構函數,此處不再做演示。




4、拷貝函數


??C++中拷貝函數也稱為拷貝構造函數,其主要目的是在初始化時,將某一個類對象的成員值直接拷貝給新的類對象,其使用方法如下:
	Data data1;//方法1Data data2(data1);//方法2Data data3 = data1;

??拷貝函數的特征如下:

  1. 拷貝構造函數是構造函數的一個重載形式。
  2. 拷貝構造函數的參數只有一個且必須是類類型對象的引用,使用傳值方式編譯器直接報錯,因為會引發無窮遞歸調用。
  3. 若未顯式定義,編譯器會生成默認的拷貝構造函數。 默認的拷貝構造函數對象按內存存儲按
    字節序完成拷貝,這種拷貝叫做淺拷貝,或者值拷貝。

??那如果使用者要顯式實現拷貝函數呢?其代碼如下所示:
	Data(Data& d){_year = d._year;_month = d._month;_day = d._day;}

??可以看到在書寫拷貝函數的代碼時,參數部分使用了引用,這是因為在傳遞過程中我們直接將data放在了函數調用的部分,如果不使用引用的話,此處就會發生傳值調用,而C++編譯器默認在發生傳值調用時,會先調用其拷貝函數,而我們的拷貝函數的參數是形參,就會發生無窮無盡的遞歸調用,而編譯器在面對這種情況時會直接報錯。
在這里插入圖片描述
??其原理類似于在日常使用函數時我們所傳遞的為形參,而形參是實參的一份臨時拷貝,而拷貝函數在形參處,就會發生無窮無盡的遞歸。


??如果使用者不顯式實現拷貝函數,那么編譯器會自動生成,并按照內存存儲按字節序的方式進行拷貝,顯式實現與不實現都是使用者可以選擇的方式,具體情況按照實際需求進行選擇。




5、結語


在這里插入圖片描述

??十分感謝您觀看我的原創文章。
??本文主要用于個人學習和知識分享,學習路漫漫,如有錯誤,感謝指正。
??如需引用,注明地址。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/38323.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38323.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38323.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Excel_VBA編程

在Excel中&#xff0c;VBA&#xff08;Visual Basic for Applications&#xff09;是一種強大的工具&#xff0c;可以用來自動化各種任務。下面介紹一些常用的VBA函數和程序結構&#xff1a; 常用函數 MsgBox&#xff1a;用于顯示消息框。 MsgBox "Hello, World!"In…

【python全棧系列】day07-python數據類型-集合

Python中的集合&#xff08;Set&#xff09;是一個無序的、不包含重復元素的數據結構。它主要用于數學上的集合操作&#xff0c;如并集、交集、差集和對稱差集等。集合的基本用途包括去重和關系測試。 1、集合的特性 無序性&#xff1a;集合中的元素是無序的&#xff0c;這意…

gin-vue -admin 初始化安裝后 進入 后臺首頁報錯

報錯原因&#xff1a; 因為 我是使用的phpstudy 小皮的數據庫 默認的是MySam 的引擎 mysql 引擎需要是 innoDB 解決辦法 &#xff1a; 在linux 的環境下 配置一個數據庫 &#xff0c; 我是用的是vmware 虛擬機

深入理解分布式搜索引擎 ElasticSearch,并能基于 ELK+Kafka 搭建分布式?志收集系統

Elasticsearch是一個基于Lucene的分布式、多租戶能力的全文搜索引擎。它提供了RESTful web接口和分布式多用戶能力的全文搜索引擎&#xff0c;基于Apache許可證發行。以下是對Elasticsearch的深入理解以及如何基于ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;加…

npm緩存深度解析:理解、使用與清除指南

&#x1f31f; npm緩存深度解析&#xff1a;理解、使用與清除指南 npm&#xff08;Node Package Manager&#xff09;是JavaScript編程語言的包管理器&#xff0c;廣泛用于Node.js應用程序。它不僅幫助我們安裝和管理項目依賴&#xff0c;還擁有一個強大的緩存機制來加速這一過…

[論文筆記] BlendedDataset blend goes out of bounds for list 34 for valid split

報錯&#xff1a; Traceback (most recent call last):File "/mnt/cpfs/kexin/dlc_code/qwen2/Pai-Megatron-Patch/examples/qwen2/pretrain_qwen.py", line 211, in <module> (<megatron.core.datasets.gpt_dataset.GPTDataset object at 0x7f491886bf10&…

《昇思25天學習打卡營第8天|CarpeDiem》

《昇思25天學習打卡營第8天|CarpeDiem》 模型訓練構建數據集定義神經網絡模型定義超參、損失函數和優化器超參損失函數優化器 訓練與評估 打卡 今天是昇思25天學習打卡營的第8天&#xff0c;終于迎來 模型訓練 的部分了&#xff01;&#xff01;&#xff01; 興奮 發癲 模型訓…

SSH遠程命令執行漏洞(CVE-2024-6387)驗證

0x01、漏洞名稱 OpenSSH遠程代碼執行漏洞 &#xff08;CVE-2024-6387&#xff09; 0x02、漏洞簡介 ? OpenSSH是SSH&#xff08;Secure SHell&#xff09;協議的開源實現&#xff0c;它通過不安全的網絡在兩個不受信任的主機之間提供安全的加密通信。OpenSSH 廣泛用于基于Un…

數據庫。

數據庫安全性 論述題5’ 編程題10’ sql語言實現權限控制 一、概述 1、不安全因素 &#xff08;1&#xff09;?授權對數據庫的惡意存取和破壞 &#xff08;2&#xff09;數據庫中重要的數據泄露 &#xff08;3&#xff09;安全環境的脆弱性 2、?主存取控制?法 gr…

【ajax實戰06】進行文章發布

本文章目標&#xff1a;收集文章內容&#xff0c;并提交服務器保存 一&#xff1a;基于form-serialize插件收集表單數據 form-serialize插件僅能收集到表單數據&#xff0c;除此之外的數據無法收集到 二&#xff1a;基于axios提交到服務器保存 三&#xff1a;調用alert警告…

基于KMeans的航空公司客戶數據聚類分析

&#x1f490;大家好&#xff01;我是碼銀~&#xff0c;歡迎關注&#x1f490;&#xff1a; CSDN&#xff1a;碼銀 公眾號&#xff1a;碼銀學編程 實驗目的和要求 會用Python創建Kmeans聚類分析模型使用KMeans模型對航空公司客戶價值進行聚類分析會對聚類結果進行分析評價 實…

Linux修煉之路之進程概念,fork函數,進程狀態

目錄 一&#xff1a;進程概念 二&#xff1a;Linux中的進程概念 三&#xff1a;用getpid(),getppid()獲取該進程的PID,PPID 四&#xff1a;用fork()來創建子進程 五&#xff1a;操作系統學科的進程狀態 六&#xff1a;Linux中的進程狀態 接下來的日子會順順利利&#xf…

【區塊鏈+基礎設施】深證金融區塊鏈平臺 | FISCO BCOS應用案例

作為數據交換密集型行業&#xff0c;資本市場是區塊鏈創新應用的重要領域&#xff0c;區塊鏈技術可以有效解決諸多痛點問題。比 如&#xff0c;針對信息不對稱的問題&#xff0c;區塊鏈技術通過將整個企業的經營活動信息上鏈&#xff0c;有效降低盡調成本&#xff0c;為投融資決…

配置windows環境下獨立瀏覽器爬蟲方案【不依賴系統環境與chrome】

引言 由于部署瀏覽器爬蟲的機器瀏覽器版本不同&#xff0c;同時也不想因為部署了爬蟲導致影響系統瀏覽器數據&#xff0c;以及避免爬蟲過程中遇到的chrome與webdriver版本沖突。我決定將特定版本的chrome瀏覽器與webdriver下載到項目目錄內&#xff0c;同時chrome_driver在初始…

我使用 GPT-4o 幫我挑西瓜

在 5 月 15 日&#xff0c;OpenAI 旗下的大模型 GPT-4o 已經發布&#xff0c;那時網絡上已經傳開&#xff0c; 但很多小伙伴始終沒有看到 GPT-4o 的體驗選項。 在周五的時候&#xff0c;我組建的 ChatGPT 交流群的伙伴已經發現了 GPT-4o 這個選項了&#xff0c;是在沒有充值升…

NSSCTF-Web題目21(文件上傳-phar協議、RCE-空格繞過)

目錄 [NISACTF 2022]bingdundun~ 1、題目 2、知識點 3、思路 [FSCTF 2023]細狗2.0 4、題目 5、知識點 6、思路 [NISACTF 2022]bingdundun~ 1、題目 2、知識點 文件上傳&#xff0c;phar偽協議 3、思路 點擊upload&#xff0c;看看 這里提示我們可以上傳圖片或壓縮包&…

應對.Kastaneya勒索病毒:保護您的數據安全

導言&#xff1a; 隨著科技的發展&#xff0c;網絡安全問題也日益嚴峻。最近&#xff0c;一種名為.Kastaneya的勒索病毒開始在網絡上出現&#xff0c;對用戶的計算機和數據造成嚴重威脅。本文91數據恢復將介紹.Kastaneya勒索病毒的特點及其傳播方式&#xff0c;并提供一些有效…

Unity 解包工具(AssetStudio/UtinyRipper)

文章目錄 1.UtinyRipper2.AssetStudio 1.UtinyRipper 官方地址&#xff1a; https://github.com/mafaca/UtinyRipper/ 下載步驟&#xff1a; 2.AssetStudio 官方地址&#xff1a; https://github.com/Perfare/AssetStudio 下載步驟&#xff1a;

【HarmonyOS NEXT】鴻蒙多線程Sendable開發

非共享模塊在同一線程內只加載一次&#xff0c;在不同線程間會加載多次&#xff0c;單例類也會創建多次&#xff0c;導致數據不共享&#xff0c;在不同的線程內都會產生新的模塊對象。 基礎概念 Sendable協議 Sendable協議定義了ArkTS的可共享對象體系及其規格約束。符合Sen…

STM32mp157aaa按鍵中斷實驗

效果圖&#xff1a; 源碼&#xff1a; #include "key.h" void hal_key1_rcc_gpio_init() {// 使能GPIOF組RCC->MP_AHB4ENSETR | (0x1 << 5);// 設置引腳位輸入模式GPIOF->MODER & (~(0X3 << 18));GPIOF->MODER & (~(0X3 << 16))…