類和對象----中

這里寫目錄標題

  • <font color="#FF00FF">1. 類和對象(中)
  • <font color="#FF00FF">2. 構造函數
  • <font color="#FF00FF">3. 析構函數
  • <font color="#FF00FF">4. 拷?構造函數

1. 類和對象(中)

類的默認成員函數:類的默認成員函數就是用戶沒有寫,而編譯器自動生成的函數,?個類,我們不寫的情況下編譯器會默認?成6個默認成員函數,最后兩個之后再說。
在這里插入圖片描述

2. 構造函數

構造函數是默認成員函數之一,需要注意的是,構造函數雖然名稱叫構造,但是構造函數的主要任務并不是開空間創建對象(我們常使?的局部對象是棧幀創建時,空間就開好了),而是對象實例化時初始化對象。構造函數就相當于之前數據結構中的Init函數。
構造函數的特點:
1. 函數名與類名相同。
2. 無返回值。
3. 對象實例化時系統會?動調?對應的構造函數。
4. 構造函數可以重載。

5. 如果類中沒有顯式定義構造函數,則C++編譯器會?動?成?個?參的默認構造函數,?旦?戶顯式定義編譯器將不再?成。

6. 無參構造函數、全缺省構造函數、我們不寫構造時編譯器默認?成的構造函數,都叫做默認構造函數。但是這三個函數有且只有?個存在,不能同時存在。?參構造函數和全缺省構造函數雖然構成函數重載,但是調?時會存在歧義。

7. 我們不寫,編譯器默認?成的構造,對內置類型成員變量的初始化沒有要求,也就是說是是否初始化是不確定的,看編譯器。對于?定義類型成員變量,要求調?這個成員變量的默認構造函數初始化。如果這個成員變量,沒有默認構造函數,那么就會報錯
說明:C++把類型分成內置類型(基本類型)和?定義類型。內置類型就是語?提供的原?數據類型,如:int/char/double/指針等,?定義類型就是我們使?class/struct等關鍵字??定義的類型。

在這里插入圖片描述
這里能夠看出我們并沒有顯示調用構造函數,但成員變量還是被賦值了,說明對象實例化時系統會?動調?對應的構造函數,并且可以重載。
接下來我們看一下后三條:
在這里插入圖片描述
在這里插入圖片描述
我把前面手動生成的構造函數代碼注釋掉,會發現編譯器不會對內置類型成員變量進行處理,但是會生成調用,這里不太明顯是否完成了生成調用,后續再說,但是對應了第7條的特性,至于對于?定義類型成員變量,要求調?這個成員變量的默認構造函數初始化,這里后續跟第5條一起說。
在這里插入圖片描述
在這里插入圖片描述
這段代碼證實了第6條。
在這里插入圖片描述
在這里插入圖片描述
這里就調用了兩個?定義類型成員變量棧,也就說明了第七條:對于?定義類型成員變量,要求調?這個成員變量的默認構造函數初始化。

也就說明了第5條,如果類中沒有顯式定義構造函數,則C++編譯器會?動?成?個?參的默認構造函數,?旦?戶顯式定義編譯器將不再?成,這里就是調用了編譯器默認?成的MyQueue的構造函數。

3. 析構函數

析構函數與構造函數功能相反,析構函數不是完成對對象本?的銷毀,?如局部對象是存在棧幀的,函數結束棧幀銷毀,他就釋放了,不需要我們管,C++規定對象在銷毀時會?動調?析構函數,完成對象中資源的清理釋放?作。析構函數的功能類?我們之前Stack實現的Destroy功能,?像Date沒有Destroy,其實就是沒有資源需要釋放,所以嚴格說Date是不需要析構函數的。

析構函數的特點:
1. 析構函數名是在類名前加上字符 ~。
2. ?參數?返回值。(這?跟構造類似,也不需要加void)
3. ?個類只能有?個析構函數。若未顯式定義,系統會?動?成默認的析構函數。
4. 對象?命周期結束時,系統會?動調?析構函數。
5. 跟構造函數類似,我們不寫編譯器?動?成的析構函數對內置類型成員不做處理,?定義類型成員會調?他的析構函數。
6. 還需要注意的是我們顯?寫析構函數,對于?定義類型成員也會調?他的析構,也就是說?定義類型成員?論什么情況都會?動調?析構函數。
7. 如果類中沒有申請資源時,析構函數可以不寫,直接使?編譯器?成的默認析構函數,如Date;如果默認?成的析構就可以?,也就不需要顯?寫析構,如MyQueue;但是有資源申請時,?定要??寫析構,否則會造成資源泄漏,如Stack。
8. ?個局部域的多個對象,C++規定后定義的先析構。
在這里插入圖片描述
在這里插入圖片描述
這里顯示寫了析構函數還是會調用,證明了?定義類型成員?論什么情況都會?動調?析構函數。

4. 拷?構造函數

如果?個構造函數的第?個參數是??類類型的引?,且任何額外的參數都有默認值,則此構造函數也叫做拷?構造函數,也就是說拷?構造是?個特殊的構造函數。
拷貝構造的特點:
1. 拷貝構造函數是構造函數的?個重載。

2. 拷貝構造函數的第?個參數必須是類類型對象的引?,使?傳值?式編譯器直接報錯,因為語法邏輯上會引發?窮遞歸調?。拷?構造函數也可以多個參數,但是第?個參數必須是類類型對象的引?,后?的參數必須有缺省值。

3. C++規定?定義類型對象進?拷??為必須調?拷?構造,所以這??定義類型傳值傳參和傳值返回都會調?拷?構造完成。

4. 若未顯式定義拷?構造,編譯器會?成?動?成拷?構造函數。?動?成的拷?構造對內置類型成員變量會完成值拷?/淺拷?(?個字節?個字節的拷?),對?定義類型成員變量會調?他的拷貝構造。

5.像Date這樣的類成員變量全是內置類型且沒有指向什么資源,編譯器?動?成的拷?構造就可以完成需要的拷?,所以不需要我們顯?實現拷?構造。像Stack這樣的類,雖然也都是內置類型,但是_a指向了資源,編譯器?動?成的拷?構造完成的值拷?/淺拷?不符合我們的需求,所以需要我們??實現深拷?(對指向的資源也進?拷?)。像MyQueue這樣的類型內部主要是?定義類型Stack成員,編譯器?動?成的拷?構造會調?Stack的拷?構造,也不需要我們顯?實現MyQueue的拷?構造。這?還有?個?技巧,如果?個類顯?實現了析構并釋放資源,那么他就需要顯?寫拷?構造,否則就不需要。

6. 傳值返回會產??個臨時對象調?拷?構造,傳值引?返回,返回的是返回對象的別名(引?),沒有產?拷貝。但是如果返回對象是?個當前函數局部域的局部對象,函數結束就銷毀了,那么使?引?返回是有問題的,這時的引?相當于?個野引?,類似?個野指針?樣。傳引?返回可以減少拷貝,但是?定要確保返回對象,在當前函數結束后還在,才能?引?返回。

我們先看前兩點,首先拷貝構造函數是構造函數的?個重載。
在這里插入圖片描述
在這里插入圖片描述
這里就是d1去拷貝構造d2,所以d2打印出了結果。
在這里插入圖片描述

#include<iostream>
using namespace std;
typedef int STDataType;
class Stack
{
public:Stack(int n = 4){_a = (STDataType*)malloc(sizeof(STDataType) * n);if (nullptr == _a){perror("malloc申請空間失敗");return;}_capacity = n;_top = 0;}Stack(const Stack& st){// 需要對_a指向資源創建同樣?的資源再拷?值 _a = (STDataType*)malloc(sizeof(STDataType) * st._capacity);if (nullptr == _a){perror("malloc申請空間失敗!!!");return;}memcpy(_a, st._a, sizeof(STDataType) * st._top);_top = st._top;_capacity = st._capacity;}void Push(STDataType x){if (_top == _capacity){int newcapacity = _capacity * 2;STDataType* tmp = (STDataType*)realloc(_a, newcapacity *sizeof(STDataType));if (tmp == NULL){perror("realloc fail");return;}_a = tmp;_capacity = newcapacity;}_a[_top++] = x;}~Stack(){cout << "~Stack()" << endl;free(_a);_a = nullptr;_top = _capacity = 0;}
private:STDataType* _a;size_t _capacity;size_t _top;};
// 兩個Stack實現隊列 
class MyQueue
{
public:
private:Stack pushst;Stack popst;
};
int main()
{Stack st1;st1.Push(1);st1.Push(2);// Stack不顯?實現拷?構造,??動?成的拷?構造完成淺拷? // 會導致st1和st2??的_a指針指向同?塊資源,析構時會析構兩次,程序崩潰 Stack st2 = st1;MyQueue mq1;// MyQueue?動?成的拷?構造,會?動調?Stack拷?構造完成pushst/popst //的拷?,只要Stack拷?構造??實現了深拷?,他就沒問題 MyQueue mq2 = mq1;return 0;
}

在這里插入圖片描述
在這里插入圖片描述
這也對應第二條。
在這里插入圖片描述
去掉&這里有兩個拷貝構造,一是返回st時,2是拷貝構造ret時,但編譯器會優化成一次拷貝構造,如果傳引用返回就會報錯,野引用,這里傳值返回不會報錯的原因是臨時對象會調用stack的拷貝構造函數將st拷貝一份返回,等返回拷貝構造完了ret后再銷毀。這符合第三條。
第5條和第6條結合前面理解。

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

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

相關文章

CAD 的 C# 開發中,對多段線(封閉多邊形)內部的點進行 “一筆連線且不交叉、不出界

本質上是約束條件下的路徑規劃問題&#xff0c;核心是找到一條連續路徑遍歷所有點&#xff0c;同時滿足&#xff1a; 路徑不與自身交叉&#xff1b; 路徑全程在多段線&#xff08;多邊形&#xff09;內部&#xff1b; 路徑連續&#xff08;一筆畫&#xff09;。核心思路與算法步…

ZED 2i相機調試

1. 測試 ZED SDK /usr/local/zed/tools/ZED_Diagnostic/usr/local/zed/tools/ZED_Explorer2. 安裝SDK How to Install ZED SDK on Linux - Stereolabs 安裝命令&#xff1a; sudo apt install zstd./ZED_SDK_Ubuntu20_cuda12.1_tensorrt8.6_v5.0.5.zstd.run

Go語言select并發編程實戰指南

一、select作用Go 語言中的 select 語句是處理多通道&#xff08;Channel&#xff09;操作的核心控制結構&#xff0c;專為高效并發通信而設計。通過巧妙運用 select 語句&#xff0c;開發者能夠高效實現并發控制、超時處理和非阻塞通信等功能&#xff0c;使其成為 Go 語言并發…

OpenCV常見問題匯總

1、深度拷貝的問題我對整張圖像通過裁剪分別進行識別&#xff0c;出現識別結果與期望不同的問題&#xff0c;經過大量排查是OpenCV深度拷貝問題&#xff0c;我原來有問題的寫法cv::Mat matCrop matZoom(roi); cv::Mat matCrop1 matCrop(roi1); cv::Mat matCrop2 matCrop(roi2)…

【Unity開發】Unity核心學習(一)

一、2D相關1、圖片導入相關設置 &#xff08;1&#xff09;Unity支持的圖片格式 支持BMP、TIF、JPG、PNG、TGA、PSD 常用格式具體介紹&#xff1a; JPG&#xff1a;指JPGE格式&#xff0c;屬于有損壓縮格式&#xff0c;無透明通道 PNG&#xff1a;無損壓縮格式&#xff0c;有透…

Python自定義異常類的寫法與使用場景

在軟件開發的生命周期中&#xff0c;異常處理是保障程序健壯性與可維護性的關鍵環節。Python作為一門高級編程語言&#xff0c;內置了豐富的異常機制&#xff0c;能夠高效、優雅地應對運行時的各種錯誤。然而&#xff0c;面對復雜業務場景和多層架構時&#xff0c;內置異常往往…

為 Promethus 配置https訪問

一、序言 本篇將介紹如何使用數字證書為Promethus 訪問提供加密功能&#xff0c;由于是實驗環境證書由openssl生成&#xff0c;操作指南來自官網手冊&#xff1a;https://prometheus.io/docs/guides/tls-encryption/在生產環境中prometheus可能會放在后端&#xff0c;證書一般配…

擺脫例行 SQL 報表的隱性成本:用 n8n 構建四節點自動化報告流程

例行 SQL 報表的隱藏成本 各類組織的數據團隊都面臨同樣的反復難題:利益相關方需要定期報告,但手工 SQL 報表占用了本可用于分析的寶貴時間。無論公司規模如何,流程幾乎一致——連接數據庫、執行查詢、格式化結果,并將結論分發給決策者。 數據從業者經常要處理并不需要高…

HCIP——OSPF綜合實驗

一、實驗拓撲二、實驗要求1、R4為ISP&#xff0c;其上只配置IP地址&#xff1b;R4與其他所直連設備間均使用公有IP&#xff1b; 2、R3-R5、R6、R7為MGRE環境&#xff0c;R3為中心站點&#xff1b; 3、整個OSPF環境IP基于172.16.0.0/16劃分&#xff1b;除了R12有兩個環回&#x…

GitHub 趨勢日報 (2025年08月12日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖1397gpt4all442system-prompts-and-models-of-ai-tools331umami307full-stack-fast…

Linux網絡性能調優終極指南:深度解析與實踐

Linux網絡性能調優終極指南&#xff1a;深度解析與實踐 一、性能調優核心原理體系 1.1 數據包生命周期與性能瓶頸 #mermaid-svg-TsvnmiGx1WeTerK2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-TsvnmiGx1WeTerK2 .…

串口超時參數深度解析:ReadTotalTimeoutMultiplier、ReadIntervalTimeout等

一、參數定義與作用 1.1 ReadIntervalTimeout&#xff08;字符間隔超時&#xff09; 定義&#xff1a;指定兩個連續字符到達之間的最大允許時間&#xff08;毫秒&#xff09;作用&#xff1a;當接收兩個字符的時間間隔超過該值時&#xff0c;ReadFile操作立即返回已緩沖的數據特…

ubuntu20.04下C++實現點云的多邊形區域過濾(2種實現:1、pcl的CropHull濾波器;2、CUDA上實現射線法)

在點云目標檢測中&#xff0c;經常會有一系列的誤識別&#xff0c;為了減小誤識別的概率&#xff0c;可以通過區域過濾來刪除不需要的點云&#xff0c;如下圖所示 本例中點云的場景為路口交通場景&#xff0c;已經把雷達坐標系的xoy面轉換至點云中的地平面&#xff0c;具體原理…

Java 大視界 -- Java 大數據在智能家居場景聯動與用戶行為模式挖掘中的應用(389)

Java 大視界 -- Java 大數據在智能家居場景聯動與用戶行為模式挖掘中的應用(389) 引言: 正文: 一、傳統智能家居的 “劇本困境”:按流程走,不管人需 1.1 設備與用戶的 “理解差” 1.1.1 場景聯動 “太機械” 1.1.2 行為識別 “太粗糙” 1.1.3 技術落地的 “體驗坑” 二、…

7 ABP Framework 支持的 UI 框架

ABP Framework 支持的 UI 框架 該頁面詳細介紹了 ABP Framework 支持的三種 UI 框架&#xff08;Angular、Blazor、MVC/Razor Pages&#xff09;&#xff0c;以及它們的架構、依賴、項目結構和共享基礎設施。 框架概述 ABP 提供三種獨立又可組合使用的 UI 框架&#xff0c;它們…

C++中的`if`語句多操作條件執行及順序保證技術指南

C中的if語句多操作條件執行及順序保證技術指南 1. 引言 在C編程中&#xff0c;if語句是控制程序流程的基本結構。隨著C17引入if語句的初始化部分&#xff0c;開發者獲得了在條件判斷前執行初始化操作的能力。然而&#xff0c;實際開發中常遇到更復雜的場景&#xff1a;?在條件…

基于SpringBoot+Uniapp的非遺文化宣傳小程序(AI問答、協同過濾算法、Echarts圖形化分析)

“ &#x1f388;系統亮點&#xff1a;AI問答、協同過濾算法、Echarts圖形化分析”01系統開發工具與環境搭建前后端分離架構項目架構&#xff1a;B/S架構運行環境&#xff1a;win10/win11、jdk17小程序端&#xff1a;技術&#xff1a;Uniapp&#xff1b;UI庫&#xff1a;colorU…

[TG開發]簡單的回聲機器人

你好! 如果你想了解如何在Java上編寫Telegram機器人&#xff0c;你來對地方了!準備啟動機器人API基于HTTP請求&#xff0c;但在本書中我將使用Rubenlagus的Java庫安裝庫你可以使用不同的方法安裝TelegramBots庫, 我這里使用Maven<dependency><groupId>org.telegram…

Ubuntu下快速安裝Tomcat教程

Apache Tomcat 是一個開源的軟件服務器,用于部署和運行 Java Servlet 和 JSP(JavaServer Pages)。本文將詳細介紹如何在 Ubuntu 系統上安裝并配置 Apache Tomcat。無論你是要開發企業級應用還是學習 Java Web 開發,Tomcat 都是一個不可或缺的工具。 Tomcat 基礎功能 Tomca…

并發編程(八股)

概述并行:同一個時間點,多個線程同時執行 并發:同一個時間段,多個線程交替執行,微觀上是一個一個的執行,宏觀上感覺是同時執行 核心問題: 多線程訪問共享數據存在資源競用問題 不可見性 java內存模型(jmm) 變量數據都存在于主內存里,每個線程還有自己的工作內存(本地內存),規定…