深入理解構造函數,析構函數

目錄

1.引言

2.構造函數

1.概念

2.特性

3.析構函數

1.概念

2.特性


1.引言

? ? ? ?? ? 如果一個類中什么都沒有,叫作空類.

class A {};

????????那么我們這個類中真的是什么都沒有嗎?其實不是,如果我們類當中上面都不寫.編譯器會生成6個默認的成員函數。

????????默認成員函數:用戶沒有顯示寫 , 編譯器自動生成的函數。

????????這里我們只介紹兩個構造函數,析構函數

2.構造函數

class Stack {
public:void init(int defaultCapacity) {_a = new int[defaultCapacity];_top = 0;}void destory() {delete[] _a;_top = 0;}
private:int* _a;int _top;
};
int main() {Stack s;s.init();return 0;
}

? ? ? ? 我們想要去寫一個棧,但是我們每次都要調用init去初始化非常麻煩,那么我們有沒有上面方法不用寫init()呢?有的,所以我們就引出了構造函數.

1.概念

? ? ? ? 構造函數是一個默認的成員函數,名字與類名相同,每次創建對象的時候自動調用,完成對象的初始化,在生命周期內只會調用一次。

2.特性

? ? ? ? 1.名字與類名相同.

? ? ? ? 2.無返回值

? ? ? ????????? 例如:我們上面的棧

 ?Stack()? {_a = new int[4];_top = 0;}

? ? ? ? 3.可以進行重載

帶參數
Stack(int defaultCapacity) {_a = new int[defaultCapacity];_top = 0;
}不帶參數
Stack() {_a = new int[4];_top = 0;
}

? ? ? ? 4.自動調用

class A {
public:A() {cout << "A()" << endl;}
};
int main() {A a;return 0;
}

? ? ? ? 例如我們有一個類A,它有一個無參的構造函數,我們在創建對象的時候,沒有顯示的調用構造函數,但是是我們調用的時候會打印出A().

? ? ? ? 這是因為我們的構造函數,在創建對象的時候會自動調用,來初始化對象。

5.用戶定義的時候就不會再生成

? ? ? ? 我們把A改為不帶構造函數的類

class A {
public:
};
int main() {A a;return 0;
}

? ? ? ? 我們看到沒有報錯,因為編譯器在我們沒有寫構造函數的時候生成一個隱式不帶參數的構造函數.

? ? ? ? 還是上面的例子,我們把A的構造函數改成帶有一個參數的構造函數.

class A {
public:A(int a) {cout << "A(a)" << endl;}
};
int main() {A a;return 0;
}

????????這個時候,我們在像剛才一樣創建對象編譯器就會報錯。

? ? ? ? 這是因為我們沒有寫構造函數的時候,編譯器會默認生成一個不帶參數的構造函數.如果我們顯示寫了構造函數編譯器就不會生成。

6.生成默認構造對內置類型不進行處理

? ? ? ?還是上面的例子,我們把類A中添加結果成員變量

class A {
public:int _a;double _d;int* _ptr;
};
int main() {A a;return 0;
}

? ? ? ? 這個時候我們沒有顯示的寫構造函數,這個時候編譯器會自動生成一個不帶參數的構造函數.

這個時候我們想看到默認構造對內置類型做不做處理怎么辦?這個時候我們可以通過調式去看

????????我們看一下調式結果,_a和_d都為隨機值,這說明我們生成的默認構造對內置類型不做處理.那么我們以后是不是都要寫構造函數呢?

? ? ? ? ?其實不是,在c++在聲明的時候可以給缺省值.這個時候我們給缺省值,再調式看一下結果.

? ? ?7.? 默認構造函數:? 編譯器自動生成,無參,全缺省都可以稱為默認構造函數

class A {
public:A() {cout << "A()" << endl;}A(int a = 1, int b = 1) {cout << "A(int a = 1, int b = 1)" << endl;}int _a;int _b;
};
int main() {A a;return 0;
}

? ? ? ? 什么的代碼編譯器會報錯這是為什么?因為,無參的和全缺省的都可以不傳參數,編譯器無法辨別調用哪一個.所以就會報錯.

3.析構函數

? ? ? ? 還是上面的棧,如果我們想讓銷毀棧,每次都要調用destroy非常麻煩,而且有時候我們會忘記調用,這個就會導致內存泄漏導致程序崩潰。所以我們c++就引出一個新的默認成員函數叫作析構函數.

1.概念

? ? ? ? 與構造函數的功能相反,析構函數是用來清理對象內的資源的,不是用來銷毀對象,局部的對象銷毀,是編譯器來完成的。

2.特性

? ? ? ? 1.在類名前面加上~

? ? ? ? 2.無返回值

? ? ? ? 例如:

-Stack() {
}

3.一個類中只能有一個析構函數,和構造函數一樣如果我們不顯示定義析構函數,編譯器就會自動生成(析構函數不能重載)

?4.析構函數會自動調用

class A {
public:~A() {cout << "~A()" << endl;}
};
int main() {A a;return 0;
}

? ? ? ? 我們這個代碼沒有顯示的調用析構函數,但是最后的結果卻輸出~A().

????????這就說明了我們的析構函數和構造函數一樣是自動調用.

?5.編譯器生成的默認成員函數對自定義類型自動調用自定義類型的構造函數

class B {
public:~B() {cout << "~B()" << endl;}
};
class A {
public:B _b;
};
int main() {A a;return 0;
}

? ? ? ? 什么代碼中A類當中有一個自定義類型B,并且A當中沒用顯示的寫析構函數,是由編譯器自動生成的構造函數.我們看一下運行之后的結果是什么?

????????

? ? ? ? 我們可以看到輸出了~B(),說明編譯器默認生成的析構函數,對自定義類型會去調用的它的析構函數.

? ? ? ? 6.如果類當中沒有定義資源,那么我們的析構函數可以不寫,直接用編譯器生成的析構函數即可.

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

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

相關文章

Oracle 11.2.0.4 pre PSU Oct18 設置SSL連接

Oracle 11.2.0.4 pre PSU Oct18 設置SSL連接 1 說明2 客戶端配置jdk環境3服務器檢查oracle數據庫補丁4設置ssla 服務器配置walletb 上傳測試腳本和配置文件到客戶端c 服務器修改數據庫偵聽和sqlnet.orad 修改客戶端的sqlnet.ora和tnsnames.ora的連接符e 修改java代碼的數據連接…

BrepGen中的幾何特征組裝與文件保存詳解 deepwiki occwl OCC包裝庫

有這種好東西我怎么不知道 AutodeskAILab/occwl: Lightweight Pythonic wrapper around pythonocc 組裝幾何特征以創建B-rep模型 保存為STEP和STL文件細說 Fast 快速 Searched across samxuxiang/BrepGen Ill explain how BrepGen assembles geometric features to create B-r…

重慶 ICPC 比賽游記

2025.5.9 比賽前一天晚上&#xff0c;激動地睡不著覺&#xff0c;起來收拾了好多東西。&#xff08;其實就四本書&#xff0c;剩下的全是零食……關鍵在于這四本書基本沒用。&#xff09; 2025.5.10 學校喪心病狂的讓我們 6:20 到校門口集合坐車&#xff08;據說是怕趕不上比…

0x08.Redis 支持事務嗎?如何實現?

回答重點 Redis 支持事務,但它的事務與 MySQL 等關系型數據庫的事務有著本質區別。MySQL 中的事務嚴格遵循 ACID 特性,而 Redis 中的事務主要保證的是命令執行的原子性和隔離性,即所有命令在一個不可分割的操作中順序執行,不會被其他客戶端的命令請求所打斷。 最關鍵的區…

佰力博科技與您探討表面電阻的測試方法及應用領域

表面電阻測試是一種用于測量材料表面電阻值的技術&#xff0c;廣泛應用于評估材料的導電性能、靜電防護性能以及絕緣性能。 1、表面電阻的測試測試方法&#xff1a; 表面電阻測試通常采用平行電極法、同心圓電極法和四探針法等方法進行。其中&#xff0c;平行電極法通過在試樣…

數據庫的規范化設計方法---3種范式

第一范式&#xff08;1NF&#xff09;&#xff1a;確保表中的每個字段都是不可分割的基本數據項。 第二范式&#xff08;2NF&#xff09;&#xff1a;在滿足1NF的基礎上&#xff0c;確保非主屬性完全依賴于主鍵。 第三范式&#xff08;3NF&#xff09;&#xff1a;在滿足2NF的基…

產品經理入門(2)產品體驗報告

產品體驗報告大綱&#xff1a;重點在產品體驗——優點。 1.產品概括 可以從各大平臺搜產品介紹。 2.市場分析 按照產品方向分析各個指標——包括有效使用時間,市場規模等。 3. 用戶分析——對用戶通過各項指標畫像。 4.產品體驗——對各項功能與設計的體驗。 5.報告總結

[Java][Leetcode simple] 13. 羅馬數字轉整數

一、自己想的 只有提到的六種情況是-&#xff0c;其他都是 public int romanToInt1(String s) {int res 0;int n s.length();Map<Character, Integer> map new HashMap<>();map.put(I, 1);map.put(V, 5);map.put(X, 10);map.put(L, 50);map.put(C, 100);map.pu…

如何在 CentOS 7 虛擬機上配置靜態 IP 地址并保持重啟后 SSH 連接

在使用 CentOS 7 的虛擬機時&#xff0c;我們通常需要配置靜態 IP 地址&#xff0c;以確保在每次虛擬機重啟后能夠通過 SSH 連接。本文將介紹如何在 CentOS 7 系統中配置靜態 IP 地址&#xff0c;并確保配置在系統重啟后依然生效。 步驟 1&#xff1a;檢查虛擬機網絡接口 首先…

matlab求解問題

一、目的 掌握Matlab中函數求導、函數極值和極限問題的求解,能夠借助Matlab工具對簡單優化模型進行求解。 二、內容與設計思想 1、函數求導 1.1求解給定函數的一階導數&#xff1a;diff(y, x)用于對變量x求y的導數。 1.2求解給定函數的二階導數&#xff1a;在求出一階導數的…

C語言斐波那契數列

斐波那契數列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又稱黃金分割數列 、兔子數列。由意大利數學家萊昂納多?斐波那契在 1202 年提出&#xff0c;源于其《算盤書》中一道兔子繁殖問題。定義&#xff1a;在數學上&#xff0c;該數列以遞歸形式定義。最常見的是…

AI浪潮:開啟科技新紀元

AI 的多面應用? AI 的影響力早已突破實驗室的圍墻&#xff0c;在眾多領域落地生根&#xff0c;成為推動行業變革的重要力量。 在醫療領域&#xff0c;AI 宛如一位不知疲倦的助手&#xff0c;助力醫生提升診療效率與準確性。通過對海量醫學影像的深度學習&#xff0c;AI 能夠快…

Ansys 計算剛柔耦合矩陣系數

Ansys 計算剛柔耦合系數矩陣 文章目錄 Ansys 計算剛柔耦合系數矩陣衛星的剛柔耦合動力學模型采用 ANSYS 的 APDL 語言的計算方法系統轉動慣量的求解方法參考文獻 衛星的剛柔耦合動力學模型 柔性航天器的剛柔耦合動力學模型可以表示為 m v ˙ B t r a n η F J ω ˙ ω J…

算法題(148):排座椅

審題&#xff1a; 本題需要我們找到最佳的排座椅方案&#xff0c;并輸出行&#xff0c;列方案 思路&#xff1a; 方法一&#xff1a;簡單貪心 由于題目會告訴我們有哪幾對的同學會交頭接耳&#xff0c;所以我們可以記錄下第幾行/第幾列上可以隔開的同學對數&#xff0c;而題目限…

企業級電商數據對接:1688 商品詳情 API 接口開發與優化實踐

在數字化浪潮席卷全球的當下&#xff0c;企業級電商平臺之間的數據對接已成為提升運營效率、增強市場競爭力的關鍵環節。作為國內知名的 B2B 電商平臺&#xff0c;1688 擁有海量商品資源&#xff0c;通過開發和優化商品詳情 API 接口&#xff0c;企業能夠快速獲取商品信息&…

【Cesium入門教程】第七課:Primitive圖元

Cesium豐富的空間數據可視化API分為兩部分&#xff1a;primitive API面向三維圖形開發者&#xff0c;更底層一些。 Entity API是數據驅動更高級一些。 // entity // 調用方便&#xff0c;封裝完美 // 是基于primitive的封裝// primitive // 更接近底層 // 可以繪制高級圖形 /…

Oracle APEX 必須輸入項目標簽型號顯示位置

1. 正常Oracle APEX中必須輸入項目標簽的紅星顯示在標簽文字左側&#xff0c;偏偏項目要求顯示在右側&#xff0c; 加入如下全局CSS代碼 .t-Form-label {display: flex;flex-direction: row-reverse;gap: 1px; }以上。

深入理解 TypeScript 中的 unknown 類型:安全處理未知數據的最佳實踐

在 TypeScript 的類型體系中&#xff0c;unknown 是一個極具特色的類型。它與 any 看似相似&#xff0c;卻在安全性上有著本質差異。本文將從設計理念、核心特性、使用場景及最佳實踐等方面深入剖析 unknown&#xff0c;幫助開發者在處理動態數據時既能保持靈活性&#xff0c;又…

項目QT+ffmpeg+rtsp(二)——海康威視相機測試

文章目錄 前言一、驗證RTSP地址的有效性1.1 使用VLC播放器驗證1.2 使用FFmpeg命令行驗證1.3 使用Python代碼檢查網絡連接1.4 檢查攝像頭Web界面1.5 使用RTSP客戶端工具二、關于IPV4的地址2.1 原來2.1.1 原因2.2 解決2.3 顯示前言 昨晚拿到一個海康威視的相機,是連接上了交換機…

Java-Collections類高效應用的全面指南

Java-Collections類高效應用的全面指南 前言一、Collections 類概述二、Collections 類的基礎方法2.1 排序操作2.1.1 sort方法2.1.2 reverse方法2.1.3 shuffle方法 2.2 查找與替換操作2.2.1 binarySearch方法2.2.2 max和min方法2.2.3 replaceAll方法 三、Collections 類的高級應…