CPP從入門到入土之類和對象Ⅱ

一、六大默認成員函數

默認成員函數是用戶沒有顯式實現,編譯器自動生成的成員函數。
一個類,我們在不寫的情況下,編譯器會默認生成六個默認成員函數
在這里插入圖片描述
本文詳細介紹構造函數和析構函數

二、構造函數

構造函數雖名為構造函數,但是這個函數并不開辟空間創建對象(經常使用的局部對象是棧幀創建的)
構造函數的功能是:在對象實例化時初始化對象,類似于我們以前寫的Init()函數
CPP引入構造函數,我們也就可以代替Init()函數了

構造函數的特點:

  • 函數值與類名相同
class Info{
public:
// 構造函數Info(){//...}
private:
//...
};
  • 無返回值(啥都不需要給,void也不用)
  • 對象實例化時(創建對象)系統會自動調用對應的構造函數
  • 支持重載,可以根據參數不同定義多個構造函數
  • 如果沒有顯式定義構造函數,CPP的編譯器會自動生成一個無參的默認構造函數,一旦顯式定義就不會生成

構造函數的類型

  1. 默認構造函數
    默認構造函數分為無參構造函數編譯器自動生成的構造函數全缺省構造函數
    這三個函數有且只能存在一個:
    在這里插入圖片描述

無參構造函數和 全缺省構造函數雖能構成函數重載,但是會產生調用歧義
總結一下: 默認構造函數是不用傳實參的構造函數

class Info {
public:// 無參的默認構造函數Info() {_name = "UnKnow";_age = 0;}void Print() {cout << " 默認構造函數被調用" << endl;cout << _name << "  " << _age << endl;}
private:string _name;int _age;
};int main() {Info I1;I1.Print();
}

在這里插入圖片描述

  1. 帶參數的構造函數
class Info {
public:// 帶參的構造函數Info(string name, int age) {_name = name;_age = age;}void Print() {cout << " 默認構造函數被調用" << endl;cout << _name << "  " << _age << endl;}
private:string _name;int _age;
};int main() {// 調用帶參數的構造函數Info I2("kunkun", 18);I2.Print();
}

在這里插入圖片描述

編譯器自動生成的默認構造函數深度剖析

我們如果沒有顯式定義構造函數,編譯器自動生成的構造函數會將對象初始化成什么呢?
類型的分類:
在這里插入圖片描述

  • 內置類型:沒有規定要處理(可處理可不處理,看編譯器類型)
    在這里插入圖片描述

  • 自定義類型:調用自定義類型對象的默認構造函數,本質是不斷套娃,深挖!!!

在這里插入圖片描述
分析一下:

D1這個對象中有三個內置類型成員變量和一個自定義類型成員變量,不寫構造函數,首先自動生成Date()的默認構造函數,到private中發現三個內置類型,則不做處理,有個自定義類型_t,則去調用Time()的構造函數,發現有構造函數,則按照構造函數初始化命令初始化,如果Time()沒有構造函數呢?那么_hour _minute _second也是內置類型,不做處理

在這里插入圖片描述
注意:沒有默認構造函數會報錯
在這里插入圖片描述

三、析構函數

析構函數構造函數功能相反,析構函數不是銷毀對象,比如局部對象存在棧中,函數棧幀結束就自動銷毀釋放內存。
析構函數的功能是在對象銷毀時完成對象中資源的清理釋放
析構函數的功能類似于Destroy(),析構函數就可以完美替代Destroy()

析構函數的特點

  • 無參數無返回值,與構造函數類似
  • 函數名與類名相同,在類名前加字符 “~” eg:Name()
  • 一個類只能有一個析構函數,所以析構函數不能重載如果沒有顯式定義,系統會自動生成默認的析構函數
  • 對象生命周期結束,會自動調用析構函數
  • 與構造函數相同,編譯器自動生成的析構函數對內置類型不做處理,對自定義類型則會調用它的析構函數
    注意:我們顯式寫析構函數,自定義類型成員會調用它的析構函數,換句話說,自定義類型成員無論什么情況下都會調用析構函數

析構函數的語法

class Test {
public:Test() {cout << "構造函數調用成功" << endl;}~Test() {cout << "析構函數調用成功" << endl;}
private:
};int main() {cout << "程序開始運行" << endl;{Test T;// 構造函數被調用}// T生命周期結束cout << "程序運行結束";
}

在這里插入圖片描述
總結:

  • 有資源需要手動清理,需要寫析構函數
  • 有兩種場景不需要寫析構函數,利用默認生成的即可:
    1. 沒有資源需要清理,例如:Date()日期列表全是局部成員
    2. 內置類型沒有資源需要清理,剩下的全是自定義類型成員,且這些類有正確的析構函數 eg:
public:Engine() { std::cout << "Engine created.\n"; }~Engine() { std::cout << "Engine destroyed.\n"; }
};class Car {
public:Engine engine;int speed;
}; // Car的析構函數不需要手寫

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

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

相關文章

【華三】路由器交換機忘記登入密碼或super密碼的重啟操作

【華三】路由器交換機忘記登入密碼或super密碼的重啟操作 背景步驟跳過認證設備&#xff1a;路由器重啟設備翻譯說明具體操作 跳過當前系統配置重啟設備具體操作 背景 當console口的密碼忘記&#xff0c;或者說本地用戶的密碼忘記&#xff0c;其實這時候是登入不了路由器的&am…

視圖窗口的客戶區

書籍&#xff1a;《Visual C 2017從入門到精通》的2.4.2 MFC應用程序類型 環境&#xff1a;visual studio 2022 內容&#xff1a;【例2.38】視圖窗口的客戶區 說明&#xff1a;以下內容大部分來自騰訊元寶。 1.創建一個單文檔程序 一個簡單的單文檔程序-CSDN博客https://bl…

MySQL原理:邏輯架構

目的&#xff1a;了解 SQL執行流程 以及 MySQL 內部架構&#xff0c;每個零件具體負責做什么 理解整體架構分別有什么模塊每個模塊具體做什么 目錄 1 服務器處理客戶端請求 1.1 MySQL 服務器端邏輯架構說明 2 Connectors 3 第一層&#xff1a;連接層 3.1 數據庫連接池(Conn…

慕慕手記項目日記 首頁數據的渲染,使用js 2025-3-16

慕慕手記項目日記 首頁數據的渲染&#xff0c;使用js 2025-3-16 到這部分我們先測試能不能使用js的方式來動態數據&#xff0c;先寫出一個簡短的demo出來 console.log("index.js文件引入了")var ClientHeight document.documentElement.clientHeight; // 可視區域…

當前企業使用VPN面臨的不足和挑戰

VPN的防護理念無法滿足數字化轉型的需求 古人云&#xff1a;知己知彼&#xff0c;百戰不殆&#xff0c;既然要替換VPN&#xff0c;就要先了解VPN。VPN于1996年起源&#xff0c;98年首次在我國出現&#xff0c;歷經25年的持續演進&#xff0c;直到現在依然廣泛流行。VPN的起源背…

python中ord()和chr()轉化ASCII數值+解密字符串例題

1.ASCII碼簡介 ASCII 即美國信息交換標準代碼&#xff08;American Standard Code for Information Interchange&#xff09;&#xff0c;是基于拉丁字母的一套電腦編碼系統&#xff0c;主要用于顯示現代英語和其他西歐語言。 發展歷程&#xff1a;ASCII 碼于 1963 年首次發布…

AMBA-CHI協議詳解(二十五)

AMBA-CHI協議詳解&#xff08;一&#xff09;- Introduction AMBA-CHI協議詳解&#xff08;二&#xff09;- Channel fields / Read transactions AMBA-CHI協議詳解&#xff08;三&#xff09;- Write transactions AMBA-CHI協議詳解&#xff08;四&#xff09;- Other transac…

HTML 區塊和布局

HTML 可以通過 <div> 和 <span>將元素組合起來。 HTML 區塊元素 大多數 HTML 元素被定義為塊級元素或內聯元素。 塊級元素在瀏覽器顯示時&#xff0c;通常會以新行來開始&#xff08;和結束&#xff09;。 實例: <h1>, <p>, <ul>, <table&…

在 STM32F7 系列微控制器中,使用定時器(如 TIM10)實現 10ms 中斷,并在中斷服務函數中調用 ProRelay() 函數

在 STM32F7 系列微控制器中&#xff0c;使用定時器&#xff08;如 TIM10&#xff09;實現 10ms 中斷&#xff0c;并在中斷服務函數中調用 ProRelay() 函數&#xff0c;可以按照以下步驟實現&#xff1a; 1. 配置 TIM10 定時器 首先&#xff0c;需要配置 TIM10 定時器&#xff0…

Web 小項目: 網頁版圖書管理系統

目錄 最終效果展示 代碼 Gitee 地址 1. 引言 2. 留言板 [熱身小練習] 2.1 準備工作 - 配置相關 2.2 創建留言表 2.3 創建 Java 類 2.4 定義 Mapper 接口 2.5 controller 2.6 service 3. 圖書管理系統 3.1 準備工作 - 配置相關 3.2 創建數據庫表 3.2.1 創建用戶表…

Godot讀取json配置文件

概述 在Godot 4.3中讀取JSON配置文件&#xff0c;可以通過以下步驟實現&#xff1a; 步驟說明 讀取文件內容&#xff1a;使用FileAccess類打開并讀取JSON文件。 解析JSON數據&#xff1a;使用JSON類解析讀取到的文本內容。 錯誤處理&#xff1a;處理文件不存在或JSON格式錯…

RabbitMQ八股文

RabbitMQ 核心概念與組件 1. RabbitMQ 核心組件及其作用 1.1 生產者&#xff08;Producer&#xff09; 作用&#xff1a;創建并發送消息到交換機。特點&#xff1a;不直接將消息發送到隊列&#xff0c;而是通過交換機路由。 1.2 交換機&#xff08;Exchange&#xff09; 作…

C語言每日一練——day_7

引言 針對初學者&#xff0c;每日練習幾個題&#xff0c;快速上手C語言。第七天。&#xff08;連續更新中&#xff09; 采用在線OJ的形式 什么是在線OJ&#xff1f; 在線判題系統&#xff08;英語&#xff1a;Online Judge&#xff0c;縮寫OJ&#xff09;是一種在編程競賽中用…

C#原型模式:通過克隆對象來優化創建過程

在軟件開發中&#xff0c;創建對象是非常常見的操作。然而&#xff0c;在某些情況下&#xff0c;構造對象的過程可能非常復雜或耗時&#xff0c;特別是當對象的創建涉及多個步驟或者需要初始化大量數據時。為了解決這個問題&#xff0c;**原型模式&#xff08;Prototype Patter…

ArcGIS10. 8簡介與安裝,附下載地址

目錄 ArcGIS10.8 1. 概述 2. 組成與功能 3. 10.8 特性 下載鏈接 安裝步驟 1. 安裝準備 2. 具體步驟 3.補丁 其他版本安裝 ArcGIS10.8 1. 概述 ArcGIS 10.8 是由美國 Esri 公司精心研發的一款功能強大的地理信息系統&#xff08;GIS&#xff09;平臺。其核心功能在于…

Mac:JMeter 下載+安裝+環境配置(圖文詳細講解)

&#x1f4cc; 下載JMeter 下載地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi &#x1f4cc; 無需安裝 Apache官網下載 JMeter 壓縮包&#xff0c;無需安裝&#xff0c;下載解壓后放到自己指定目錄下即可。 按我自己的習慣&#xff0c;我會在用戶 jane 目…

【PCB工藝】基礎:電子元器件

電子原理圖&#xff08;Schematic Diagram&#xff09;是電路設計的基礎&#xff0c;理解電子元器件和集成電路&#xff08;IC&#xff09;的作用&#xff0c;是畫好原理圖的關鍵。 本專欄將系統講解 電子元器件分類、常見 IC、電路設計技巧&#xff0c;幫助你快速掌握電子電路…

nvm 安裝某個node.js版本后不能使用或者報錯,或不能使用npm的問題

安裝了nvm之后發現不能使用某個版本的node.js&#xff0c;報錯之后&#xff0c;不能使用npm這個命令。可以這樣解決&#xff1a; 1、再node.js官網直接下載node.js 的壓縮包。 找到nvm的安裝目錄 2、直接將文件夾解壓到這個安裝目錄中修改一下名字即可。

【MySQL數據庫】多表查詢(笛卡爾積現象,聯合查詢、內連接、左外連接、右外連接、子查詢)-通過練習快速掌握法

在DQL的基礎查詢中&#xff0c;我們已經學過了多表查詢的一種&#xff1a;聯合查詢&#xff08;union&#xff09;。本文我們將系統的講解多表查詢。 笛卡爾積現象 首先&#xff0c;我們想要查詢emp表和stu表兩個表&#xff0c;按照我們之前的知識棧&#xff0c;我們直接使用…

Java:Apache HttpClient中HttpRoute用法的介紹

當使用Apache HttpClient組件時&#xff0c;經常會用到它的連接池組件。典型的代碼如下&#xff1a; PoolingHttpClientConnectionManager connectionManager new PoolingHttpClientConnectionManager();connectionManager.setMaxTotal(httpConfig.getMaxPoolTotal());connect…