【C++】類和對象——構造函數和析構函數

今天要學習兩個特殊的函數,分別是構造函數析構函數,它們究竟有什么用呢?
比如說,我們先寫一個簡單的日期的類

class Date {
public:void Init() {_year = 1;_month = 1;_day = 1;}void Print() {cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};int main() {Date d1;d1.Init();d1.Print();return 0;
}

我們要定義一個對象后還要對這個對象進行初始化只要定義對象就要初始化,這個步驟是不是有點太繁瑣了,甚至我們有時候還會忘記初始化,所以這時,就創造了一種函數叫做構造函數,它其實就是去完成了初始化這個工作,并且它是在對象創建后自動調用的,是不是就讓我們省心了不少
它的一些規則是這樣的:

1.函數名與類名相同,意思是在日期這個例子中,構造函數的函數名也叫Date
2.無返回值,這里的無返回值意思不是寫void,而是根本就不需要寫返回值
3.對象實例化(創建對象)時編譯器自動調用對應的構造函數
4.構造函數可以重載

比如說我去寫一個構造函數

class Date {
public:Date(int year,int month,int day) {_year = year;_month = month;_day = day;}void Print() {cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};int main() {Date d1(2023,11,22);d1.Print();return 0;
}

這時就可以替換掉Init函數,并且調用的話也是這么去調用,規則的第四條是什么意思呢?構成重載嘛,就是構成重載的函數可以同時存在,比如說

	Date() {_year = 1;_month = 1;_day = 1;}Date(int year,int month,int day) {_year = year;_month = month;_day = day;}

當我去傳參調用的話就調用第二個,當我不傳參調用就調用第一個,不會產生歧義
在這里插入圖片描述
我們又知道有缺省參數這回事,如果我們給第二個構造函數缺省值的話
在這里插入圖片描述
那我不傳參調那個呢?結果是編譯出錯,因為調用有歧義
我們已經知道,如果不給構造函數的話,對于日期類(其實也就是內置類型)編譯器不會自動去調用構造函數。那如果是自定義類型呢?那編譯器就會去調用自定義類型的構造函數,如果自定義類型也沒寫構造函數,那編譯器也無法去調用。
所以在C++11中,內置類型是可以給值的,比如說
在這里插入圖片描述
就是在聲明的時候后面給上值,這時如果沒有構造函數的話,就會用給定的值去初始化,就像這樣
在這里插入圖片描述
這種情況我們是不是沒有寫構造函數,可是數據還是初始化了,這時我們就有了一個默認構造的概念,總的來說,我們不去傳參數調用的構造函數,都可以叫做默認構造。除了這種情況,還有無參構造函數全缺省構造函數也可以叫默認構造。這三種情況是不能同時存在的
那我們在看看下面這種情況
在這里插入圖片描述
構造函數不給缺省值,并且在調用的時候也不給值,這樣是會報錯的
因為我既然不給d1傳值,但是它有構造函數,不傳參數就無法調用這個構造函數
有了所謂的初始化函數,那我們是不是也需要一個銷毀函數呢?這樣就有了我們的析構函數,這里的析構函數其實不是完成對對象本身的銷毀,而是完成對象中資源的清理工作(比如說,當一個日期類的對象生命周期結束時,它調用析構函數是沒有多大意義的,因為它的年月日隨著棧幀的銷毀就一并銷毀了;但是對于一個棧,它是在堆上申請過空間的,這時把堆上的空間要釋放掉是非常有必要的),它的規則如下

1.析構函數名是在類名前加上~
2.無參數,無返回值類型
3.一個類只能有一個析構函數,若未顯示定義,系統會自動生成默認的析構函數,并且析構函數不能重載,因為根本就沒有參數嘛
4.對象生命周期結束時,會自動調用析構函數

大概就是這樣子的
在這里插入圖片描述
可以看到,一個對象的創建和生命周期結束確實會自動調用構造函數和析構函數
這里打印的話就是為了表示一下是否調用了該函數和什么時候調用析構函數

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

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

相關文章

Sentinel 分布式系統

Sentinel 是一種分布式系統的流量防衛兵和熔斷器&#xff0c;由阿里巴巴開發并開源。它的主要目標是保護分布式系統中的穩定性和可用性&#xff0c;防止因高并發或異常流量而導致的系統崩潰。下面是 Sentinel 的原理和使用教程的概要&#xff1a; Sentinel 的原理&#xff1a;…

如何去開發一個springboot starter

如何去開發一個springboot starter 我們在平時用 Java 開發的時候&#xff0c;在 pom.xml 文件中引入一個依賴就可以很方便的使用了&#xff0c;但是你們知道這是如何實現的嗎。 現在我們就來解決這一個問題&#xff01; 創建 SpringBoot 項目 首先我們要做的就是把你想要給別…

css3

基礎 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>style</title><!-- link&#xff08;外部樣式&#xff09;和style&#xff08;內部樣式&#xff09;優先級相同&#xff0c;重復寫會覆蓋 --><link re…

面試題-9

1.如何封裝一個組件 1.使用Vue.extend()創建一個組件 2.使用Vue.components()方法注冊組件 3.如果子組件需要數據,可以在props中接收定義 4.子組件修改好數據,要把數據傳遞給父組件&#xff0c;可以用emit()方法 原則: 把功能拆開 盡量讓組件原子化,一個組件做一件事情 …

centos7安裝MySQL—以MySQL5.7.30為例

centos7安裝MySQL—以MySQL5.7.30為例 本文以MySQL5.7.30為例。 官網下載 進入MySQL官網&#xff1a;https://www.mysql.com/ 點擊DOWNLOADS 點擊鏈接&#xff1b; 點擊如上鏈接&#xff1a; 選擇對應版本&#xff1a; 點擊下載。 安裝 將下載后的安裝包上傳到/usr/local下…

CTF靶場搭建及Web賽題制作與終端docker環境部署

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 寫在前面 ╔═══════════════════════════════════════════════════…

使用ChatGPT創建Makefile構建系統:使用Make運行Docker

使用ChatGPT創建Makefile構建系統&#xff1a;使用Make運行Docker 芯語芯愿&#xff08;知乎/紛傳/CSDN/&#xff09;&#xff1b;小石頭的芯語芯愿&#xff08;微信公眾號&#xff09; 開發高效現代的構建系統對于滿足開發周期需求至關重要。原先&#xff0c;嵌入式開發者一…

Unity 場景烘培 ——LensFlare鏡頭光暈(三)

提示&#xff1a;文章有錯誤的地方&#xff0c;還望諸位大神指出&#xff01; 文章目錄 前言一、鏡頭光暈 (Lens Flares)是什么&#xff1f;二、使用Lens Flares組件總結 前言 一般情況下都會忽略的東西&#xff0c;鏡頭光暈。理論上不加鏡頭光暈&#xff0c;也不會有什么影響…

vue3的兩個提示[Vue warn]: 關于組件渲染和函數外部使用

1. [Vue warn]: inject() can only be used inside setup() or functional components. 這個消息是提示我們&#xff0c;需要將引入的方法作為一個變量使用。以vue-store為例&#xff0c;如果我們按照如下的方式使用&#xff1a; import UseUserStore from ../../store/module…

數據治理之考評環節

考評的流程&#xff08;批處理&#xff09; 周期調度&#xff0c;每天一次&#xff1a;采集hive, hdfs元數據存放到mysql中的dga庫的metainfo表手動通過管理頁面補充輔助信息指標考評 讀取要考評的表的元數據及輔助信息讀取要考評的指標對每張表的每個指標逐個進行考評保存考評…

RabbitMQ快速入門(簡單收發消息)

文章目錄 前言一、數據隔離1.用戶管理2.virtual host 二、控制臺收發1.交換機2.隊列3.綁定 三、編程式收發1.依賴和配置2.收發信息 總結 前言 1.了解數據隔離 2.RabbitMQ控制臺收發信息 3.SpringBoot整合RabbitMQ收發信息 一、數據隔離 1.用戶管理 點擊Admin選項卡&#xff0…

mmdet全教程

官方給的文檔一言難盡&#xff0c;網上的教程又沒有從大綱到源碼的完整解讀&#xff0c;計劃年后開個系列記錄一下

依賴庫:Ceres-solver-2.0.0安裝

依賴庫&#xff1a;Ceres-solver-2.0.0安裝 前言安裝ceres-solver-2.0.0驗證 前言 Ceres Solver是谷歌開源的C非線性優化庫&#xff0c;能夠解決有約束或無約束條件下的非線性最小二乘問題。2010年之后大量的運用在谷歌的產品開發中&#xff0c;尤其在谷歌開源的cartographer中…

圖像分類單張圖片預測準確率達到百分之百

在圖像分類任務中&#xff0c;針對單個圖片得到100%的準確率是有可能但極其罕見的&#xff0c;并且不代表模型在整個測試集上也能達到100%的準確率。 ??針對單個圖片獲得100%準確率的情況可能包括以下幾種情形&#xff1a; 圖片本身特殊性: 如果測試集中的某張圖片在訓練集中…

【python基礎(1)】變量和簡單數據類型

文章目錄 一. 變量的命名和使用二. 字符串1. 修改字符串的大小寫2. 在字符串中使用變量3. 使用制表符或換行符來添加空白4. 刪除空白 三. 數1. 整數2. 浮點數3. 整數和浮點數4. 數中的下劃線5. 同時給多個變量賦值6. 常量 三. 注釋四. Python之禪 一. 變量的命名和使用 變量規…

各種LLM數據集包括SFT數據集

各種LLM數據集包括SFT數據集 數集介紹和 hf上的名字對話數據生成方法交通領域數據集SFT 的解釋數集介紹和 hf上的名字 通用預訓練數據集 SFT datasets SFT 數據集 50萬條中文ChatGPT指令Belle數據集:BelleGroup/train_0.5M_CN 100萬條中文ChatGPT指令Belle數據集:BelleGrou…

C++學習 --stack

目錄 1&#xff0c; 什么是stack 2&#xff0c; 創建stack 2-1&#xff0c; 標準數據類型 2-2&#xff0c; 自定義數據類型 2-3&#xff0c; 其他創建方式 3&#xff0c; 操作stack 3-1&#xff0c; 賦值 3-2&#xff0c; 插入元素(push) 3-3&#xff0c; 查詢元素 3…

Linux的簡單使用

Linux命令使用技巧 Tab鍵自動補全連續兩次Tab鍵&#xff0c;給出操作提示使用上下箭頭快速調出曾經使用過的命令使用clear命令或者Ctrll快捷鍵實現清屏Linux的常用命令 命令作用詳細說明ls [-al] [dir]顯示指定目錄下的內容 -a 顯示所有文件及目錄 (. 開頭的隱藏文件也會列出) …