《C++》面向對象編程--類(中)

文章目錄

  • 一、構造函數
    • 1.1定義
    • 1.2語法
    • 1.3特性
  • 二、析構函數
    • 2.1定義
    • 2.2語法
    • 2.3特性
  • 三、拷貝構造函數
    • 3.1定義
    • 3.2語法
    • 3.3特性
    • 3.4淺拷貝
      • 3.4.1定義
      • 3.4.2淺拷貝的風險
    • 3.5深拷貝

一、構造函數

1.1定義

在C++中,構造函數(Constructor) 是一種特殊的成員函數,用于在創建對象時初始化其成員變量。構造函數的名稱必須與類名相同,且沒有返回類型(包括 void)。構造函數在對象創建時自動調用,確保對象處于有效狀態。

1.2語法

class ClassName {
public:ClassName(){內容}           // 默認構造函數(無參)ClassName(參數列表){內容}           // 帶參構造函數// ... 其他成員函數
};

示例:

class Date {
public:Date(){_year = 1970;_month = 1;_day = 1;// 默認構造函數實現。如若未定義則是隨機值。}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;           // 調用默認構造函數Date d2(2023, 5, 15); // 調用帶參構造函數Date d3{};         // C++11統一初始化方式調用默認構造函數d1.print();  // 輸出: 1970-1-1d2.print();  // 輸出: 2023-5-15d3.print();  // 輸出: 1970-1-1return 0;
}

1.3特性

構造函數的主要任務并不是開空間創建對象,而是初始化對象。 它具有以下特點:

  • 1.函數名與類名相同。
  • 2.無返回值。
  • 3.對象實例化時編譯器自動調用對應的構造函數。
  • 4.構造函數可以重載。
  • 5.如果未寫構造函數,編譯器默認生成的是"類名();"

二、析構函數

2.1定義

在C++中,析構函數(Destructor) 是一種特殊的成員函數,用于在對象生命周期結束時自動執行清理工作(如釋放內存、關閉文件等)。它的名稱是在類名前加 ~,沒有返回類型,也不接受任何參數。一般在有動態內存申請的時候要寫析構函數。沒動態申請的一般不需要寫析構。

2.2語法

class ClassName {
public:~ClassName();  // 析構函數,函數體定義默認沒有,也可以自己定義。如下文示例。
};

示例:

class Date {
public:~Date(){cout << "Date對象被銷毀" << endl;}
private:int year;int month;int day;
};int main()
{Date a;return 0;
}
//程序結束后會打印"Date對象被銷毀"。

2.3特性

  • 1.自動調用。
  • 2.不能重載。

三、拷貝構造函數

3.1定義

拷貝構造函數是構造函數的一種重載形式,專門用于用已存在的對象創建新對象,核心是實現對象的“復制”。它的參數必須是同類對象的引用(通常加 const ,防止意外修改原對象),這是與普通構造函數的關鍵區別。

3.2語法

class MyClass {
public:// 拷貝構造函數聲明MyClass(const MyClass& other);
};// 拷貝構造函數實現
MyClass::MyClass(const MyClass& other) {// 拷貝邏輯
}

3.3特性

  • 1.參數類型:
    ①必須是對同類對象的const引用

    ②使用引用避免無限遞歸

    ③const確保不修改源對象

  • 2.無返回值:構造函數沒有返回類型

  • 3.通常不聲明為explicit:允許隱式拷貝構造

3.4淺拷貝

3.4.1定義

  • 1.逐成員復制:簡單復制對象的所有非靜態成員變量

  • 2.指針共享:對于指針成員,僅復制指針值(地址),不復制指向的內容

  • 3.默認行為:編譯器生成的默認拷貝構造函數執行的就是淺拷貝
    示例:

class Time
{
public:Time(){_hour = 1;_minute = 1;_second = 1;}Time(const Time& t)//這就是淺拷貝{_hour = t._hour;_minute = t._minute;_second = t._second;}
private:int _hour;int _minute;int _second;
};

3.4.2淺拷貝的風險

雙重釋放問題:
假如arr2是arr1的拷貝。
當arr1和arr2離開作用域時:
先調用arr2的析構函數釋放內存。
再調用arr1的析構函數再次釋放同一內存 → 程序崩潰

3.5深拷貝

深拷貝是指:

  • 1.創建新對象時完全復制所有數據

  • 2.對指針成員分配新內存并復制內容

  • 3.副本與原對象完全獨立,不共享任何資源

示例:(棧)

class SafeStack {
private:int* data;int capacity;int topIndex;public:// 構造函數SafeStack(int size): capacity(size), topIndex(-1), data(new int[size]) {}// 深拷貝構造函數SafeStack(const SafeStack& other): capacity(other.capacity),topIndex(other.topIndex),data(new int[other.capacity]) {// 復制棧中所有元素for (int i = 0; i <= topIndex; ++i) {data[i] = other.data[i];}}// 深拷貝賦值運算符SafeStack& operator=(const SafeStack& other) {if (this != &other) {  // 自賦值檢查// 創建臨時副本int* newData = new int[other.capacity];// 復制數據for (int i = 0; i <= other.topIndex; ++i) {newData[i] = other.data[i];}// 替換舊數據(異常安全)delete[] data;data = newData;capacity = other.capacity;topIndex = other.topIndex;}return *this;}// 移動構造函數(C++11)SafeStack(SafeStack&& other) noexcept: data(other.data),capacity(other.capacity),topIndex(other.topIndex) {other.data = nullptr;other.capacity = 0;other.topIndex = -1;}// 析構函數~SafeStack() {delete[] data;}void push(int value) {if (topIndex == capacity - 1) {throw std::overflow_error("Stack is full");}data[++topIndex] = value;}int pop() {if (topIndex == -1) {throw std::underflow_error("Stack is empty");}return data[topIndex--];}void print() {std::cout << "Stack: [ ";for (int i = 0; i <= topIndex; ++i) {std::cout << data[i] << " ";}std::cout << "]\n";}
};int main() {SafeStack s1(5);s1.push(1);s1.push(2);s1.push(3);// 測試拷貝構造函數SafeStack s2 = s1;  // 深拷貝// 修改s1不影響s2s1.pop();s1.push(99);// 測試賦值運算符SafeStack s3(2);s3 = s1;  // 深拷貝賦值s1.print();  // 輸出: Stack: [ 1 2 99 ]s2.print();  // 輸出: Stack: [ 1 2 3 ]s3.print();  // 輸出: Stack: [ 1 2 99 ]// 測試移動語義SafeStack s4 = std::move(s1);s1.print();  // 輸出: Stack: [ ] (已移動)s4.print();  // 輸出: Stack: [ 1 2 99 ]return 0;
}

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

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

相關文章

機器學習初學者理論初解

大家好! 為什么手機相冊能自動識別人臉&#xff1f;為什么購物網站總能推薦你喜歡的商品&#xff1f;這些“智能”背后&#xff0c;都藏著一位隱形高手——機器學習&#xff08;Machine Learning&#xff09;。一、什么是機器學習&#xff1f;簡單說&#xff0c;機器學習是教計…

原碼反碼補碼

在Java中&#xff0c;無論是小數還是整數&#xff0c;他們都要帶有符號&#xff08;和C語言不同&#xff0c;C語言有無符號數&#xff09;。首位就作為符號位。原碼反碼&#xff1a;正數的反碼是其原碼本身負數的反碼是在其原碼的基礎上, 符號位不變&#xff0c;其余各個位取反…

使用ubuntu:20.04和ubuntu:jammy構建secretflow環境

一、使用ubuntu:20.04構建隱語編譯環境FROM ubuntu:20.04LABEL maintainer"build SecureProtocolLib on ubuntu:20.04"ARG TARGETPLATFORM# change dash to bash as default shell RUN ln -sf /bin/bash /bin/shRUN apt update \&& apt upgrade -y \&&am…

Hinge Loss(鉸鏈損失函數)詳解:SVM 中的關鍵損失函數

&#x1f4cc; 一、什么是 Hinge Loss&#xff1f;Hinge Loss&#xff08;鉸鏈損失&#xff09;&#xff0c;是 支持向量機&#xff08;SVM, Support Vector Machine&#xff09; 中常用的一種損失函數&#xff0c;用于最大間隔分類。其核心思想是&#xff1a;當預測結果已經正…

days32 :零基礎學嵌入式之網絡2.0

一、wireshark &#xff1a;網絡抓包工具1.功能&#xff1a;抓取通過電腦網卡的網絡數據2.作用&#xff1a;排查故障、抓取數據做數據分析、3.用法&#xff1a;&#xff08;1&#xff09;sudo wireshark&#xff08;2&#xff09;選擇需要抓取的網卡》any&#xff08;3&#xf…

數字護網:一次深刻的企業安全體系靈魂演練

&#x1f9e9; 引言&#xff1a;什么是“護網”&#xff1f;—— 不止是攻防&#xff0c;更是企業安全能力的年度大考 每年&#xff0c;由國家相關部門牽頭的“護網行動”都如期而至&#xff0c;各大企事業單位的安全團隊也隨之進入高度戒備狀態。然而&#xff0c;“護網”遠非…

基于 NumPy 的高效數值計算技術解析與實踐指引

在數據處理與科學計算領域&#xff0c;高效是核心訴求。NumPy 作為 Python 生態高效數值計算的基石&#xff0c;以高性能多維數組對象及配套函數&#xff0c;成為數據從業者的必備工具。其數組支持算術、比較、邏輯等豐富運算&#xff0c;通過向量化操作直接處理每個元素&#…

Kafka MQ 控制器 broker

Kafka MQ 控制器 broker 1 控制器broker的選舉 在 Kafka 集群中會有一個或多個 broker,其中有一個 broker 會被選舉為控制器(Kafka Controller)?,它負責管理整個集群中所有分區和副本的狀態。當某個分區的leader副本出現故障時,由控制器負責為該分區選舉新的leader副本…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | ImageCarousel(圖片輪播組件)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— ImageCarousel組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 <script setup> 語法以及 Tailwind CSS …

基于springboot的智能物流管理系統(源碼+論文)

一、開發環境 MYSQL數據庫 MySQL是一個真正的多用戶、多線程SQL數據庫服務器&#xff0c;基于SQL的客戶/服務器模式的關系數據庫管理系統。其特點包括&#xff1a; 功能強大&#xff1a;支持多用戶、多線程操作。使用簡單&#xff1a;管理方便&#xff0c;安全可靠性高。跨平…

Collection接口的詳細介紹以及底層原理——包括數據結構紅黑樹、二叉樹等,從0到徹底掌握Collection只需這篇文章

目錄 Collection簡介 Collection的遍歷方式 迭代器遍歷 增強for遍歷 Lambda表達式遍歷 List集合 List集合的遍歷方式 列表迭代器遍歷以及普通for循環 數據結構 棧 隊列 數組 鏈表 單向鏈表 雙向鏈表 二叉樹 遍歷方式 普通二叉樹 二叉查找樹 平衡二叉樹 旋轉…

《安順棒壘球》世界十大運動·棒球1號位

Worlds Top 10 Sports for Newbies | 棒球排第幾&#xff1f; 全球青訓體系大揭秘 ?添加圖片注釋&#xff0c;不超過 140 字&#xff08;可選&#xff09;神王棒球世界十大運動排名 Top 10 Global Sports&#xff08;按參與度/商業價值/影響力綜合排序&#xff09;足球 Footba…

什么是“差分“?

1. 什么是"差分"&#xff1f;想象兩個人在玩蹺蹺板&#xff1a;當兩人同時向上跳&#xff08;同向移動&#xff09;→ 蹺蹺板不動 → 這叫"共模"當一人向上&#xff0c;另一人向下&#xff08;反向移動&#xff09;→ 蹺蹺板傾斜 → 這叫"差分"差…

4.組合式API知識點(2)

10 組合式API - 模版引用模板引用的概念如何使用&#xff08;以獲取dom為例 組件同理&#xff09;組件實例對象defineExpose()11 組合式API - provide和inject作用和場景跨層傳遞普通數據跨層傳遞響應式數據跨層傳遞方法需求解決思考

GitLab企業版部署與許可證生成完整指南

GitLab企業版部署與許可證生成完整指南一、背景二、環境準備三、部署步驟1. 創建目錄結構2. 生成GitLab許可證2.1 克隆許可證生成器2.2 修改生成器腳本2.3 構建Docker鏡像2.4 生成許可證文件3. 創建Docker Compose配置文件4. 啟動GitLab容器4.1 初始啟動4.2 修改GitLab配置4.3 …

Jenkins 不同節點間文件傳遞:跨 Job 與 同 Job 的實現方法

在日常的 DevOps 運維實踐中&#xff0c;Jenkins 通常被用于串聯多個自動化流程&#xff0c;而這些流程往往需要在不同的構建節點&#xff08;agent&#xff09;上執行。例如&#xff0c;在以下場景中&#xff1a; &#x1f4cc; 場景需求描述&#xff08;實際問題&#xff09;…

Java中AQS原理

一、核心架構&#xff1a;AQS抽象隊列同步器二、AQS核心機制1. 三大核心組件&#xff1a;state狀態變量&#xff1a;volatile int&#xff0c;表示鎖狀態&#xff08;0未鎖定&#xff0c;≥1鎖定/重入次數&#xff09;CLH隊列&#xff1a;雙向鏈表實現的線程等待隊列Node節點&a…

深入理解程序鏈接機制:靜態鏈接、ELF加載與動態庫實現原理

目錄 一、靜態鏈接 1、靜態鏈接的基本概念 1. 靜態鏈接實例分析 2. 目標文件分析 3. 關鍵觀察 4. 重定位機制 5. 注意事項 2、靜態鏈接過程詳解 1. 目標文件反匯編分析&#xff08;上面已分析&#xff09; 2. 符號表分析 code.o 符號表 hello.o 符號表 3. 鏈接后的…

python基礎復習

復習python基礎語法,最好能做到使用python 寫一些簡單的算法。 1基礎基礎語法 1.0 輸入輸出 一個實用的print:format函數print(站點列表 {0}, {1}, 和 {other}。.format(Google, Runoob, other=Taobao)) 站點列表 Google, Runoob, 和 Taobao。print("a", "b…

ZLMediaKit 入門

什么是ZLMediaKit&#xff1f; ZLMediaKit 是一個基于C11的高性能流媒體服務器框架&#xff0c;支持RTSP/RTMP/HLS/HTTP-FLV/WebSocket-FLV等多種流媒體協議。它具有以下特點&#xff1a; 跨平臺支持&#xff08;Linux、Windows、macOS&#xff09; 高性能&#xff0c;支持高…