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

文章目錄

  • 一、賦值運算符重載
    • 1.1定義
    • 1.2基本規則
    • 1.3為什么需要運算符重載?
    • 1.4示例:
  • 二、前置++和后置++區別
    • 2.1前置++的實現與特點
    • 2.2后置++的實現與特點
    • 2.3核心區別
  • 三、const
  • 四、取地址及const取地址操作符重載
    • 4.1定義
    • 4.2語法
    • 4.3注意事項

一、賦值運算符重載

1.1定義

運算符重載是C++的一項特性,允許我們為自定義類型(類或結構體)重新定義運算符的行為(如+, -, =, ==等),使其像內置類型一樣直觀操作。如果用戶沒有顯式實現時,編譯器會生成一個默認賦值運算符重載,以值的方式逐字節拷貝。

1.2基本規則

1. 函數命名

運算符重載函數的名稱必須是 operator 后接運算符符號。

返回值類型 operator運算符(參數列表)

示例:

ClassName& operator=(const ClassName& other) {if (this != &other) {  // 關鍵點1:自賦值檢查// 釋放舊資源 + 深拷貝新資源}return *this;  // 關鍵點2:返回引用支持鏈式賦值
}

2. 關鍵限制
? 不能創建新運算符(如 operator@ 是非法的)。
? 不能修改內置類型的運算符含義(例如 int 的 + 必須保持加法語義)。
? 以下運算符不可重載:
.* :: sizeof ?: .
3. 參數規則

  • 如果重載為成員函數,第一個操作數是隱式的 this,參數比操作數少1。
    例如 a + b 會調用 a.operator+(b)。

  • 如果重載為全局函數,參數數量必須與操作數一致。
    例如 operator+(a, b)。

1.3為什么需要運算符重載?

  • 提升代碼可讀性:date1 < date2 比 date1.isEarlierThan(date2) 更直觀。

  • 保持一致性:讓自定義類型像內置類型一樣工作。

  • 支持標準庫算法:如 std::sort 依賴 < 運算符。

1.4示例:

h文件:
#pragma once
#pragma once
#include<iostream>
using namespace std;class Date
{
public:Date(int year = 1, int month = 1, int day = 1);void Print(){cout << _year << "-" << _month << "-" << _day << endl;}bool operator<(const Date& x);bool operator==(const Date& x);bool operator<=(const Date& x);bool operator>(const Date& x);bool operator>=(const Date& x);bool operator!=(const Date& x);int GetMonthDay(int year, int month);//+xx天的情況Date& operator+=(int day);Date operator+(int day);Date& operator++();Date operator++(int);
private:int _year;int _month;int _day;
};
cpp文件
#include "20250722A.h"Date::Date(int year, int month, int day)
{_year = year;_month = month;_day = day;
}bool Date::operator<(const Date& x)
{if (_year < x._year){return true;}else if (_year == x._year && _month < x._month){return true;}else if (_year == x._year && _month == x._month && _day < x._day){return true;}return false;
}bool Date::operator==(const Date& x)
{return _year == x._year&& _month == x._month&& _day == x._day;
}bool Date::operator<=(const Date& x)
{return *this < x || *this == x;
}bool Date::operator>(const Date& x)
{return !(*this <= x);
}bool Date::operator>=(const Date& x)
{return !(*this < x);
}bool Date::operator!=(const Date& x)
{return !(*this == x);
}int Date::GetMonthDay(int year, int month)
{static int daysArr[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))//先判斷month是否等于2可以提高效率{return 29;}else{return daysArr[month];}
}Date& Date::operator+=(int day)
{_day += day;while (_day > GetMonthDay(_year, _month)){_day -= GetMonthDay(_year, _month);++_month;if (_month == 13){++_year;_month = 1;}}return *this;
}Date Date::operator+(int day)
{Date tmp(*this);tmp += day;return tmp;}
int main()
{Date d1(2025, 7, 24);d1 = d1 + 100;d1.Print();return 0;
}

二、前置++和后置++區別

2.1前置++的實現與特點

Date& Date::operator++() {*this += 1;      // 調用已重載的+=return *this;    // 返回當前對象的引用
}

使用示例:

Date d(2023, 1, 1);
++d;  // 等價于 d.operator++()

2.2后置++的實現與特點

Date Date::operator++(int) {Date tmp = *this;  // 保存舊值*this += 1;        // 修改當前對象return tmp;        // 返回舊值副本
}

使用示例:

Date d1(2023, 1, 1);
Date d2 = d1++;  // d2獲得舊值,d1自增

2.3核心區別

在這里插入圖片描述

// 前置++(推薦)
for (int i = 0; i < n; ++i)  // 無臨時對象生成// 后置++
for (int i = 0; i < n; i++)  // 每次循環構造臨時int

故我們更推薦使用前置++。

三、const

const 是 C++ 中的關鍵字,用于定義"常量"或"不可修改"的變量、函數參數、成員函數等。它的核心作用是增強程序的安全性和可讀性,幫助編譯器在編譯階段發現潛在的錯誤。

  • const對象只能調用const成員函數
  • const成員函數對任何對象都是安全的
  • const成員函數內不可以調用其它的非const成員函數
  • 非const成員函數內可以調用其它的const成員函數

四、取地址及const取地址操作符重載

4.1定義

在 C++ 中,取地址操作符 & 可以被重載,包括普通版本和 const 版本。這種重載允許你控制當用戶獲取類對象地址時的行為。

4.2語法

class MyClass {
public:// 普通取地址操作符重載MyClass* operator&() {return this; // 通常返回 this,但可以自定義}// const 取地址操作符重載const MyClass* operator&() const {return this; // 通常返回 this,但可以自定義}
};

4.3注意事項

  • 通常不建議重載取地址以及const取地址操作符,除非有充分理由,因為這可能違反用戶預期

  • 如果重載了取地址操作符,確保行為合理且文檔化

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

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

相關文章

EasyExcel 模板導出數據 + 自定義策略(合并單元格)

需求&#xff1a;數據庫里的主表明細表&#xff0c;聯查出數據并導出Excel&#xff0c;合并主表數據的單元格。代碼&#xff1a;controllerPostMapping("export")ApiOperation(value "導出數據")protected void export(ApiParam Valid RequestBody NewWms…

股指期權可以隨時平倉嗎?

本文主要介紹股指期權可以隨時平倉嗎&#xff1f;股指期權是否可以隨時平倉&#xff0c;需結合交易規則、合約狀態及市場流動性綜合判斷&#xff0c;具體如下。股指期權可以隨時平倉嗎&#xff1f;一、正常交易時間內的平倉規則在交易日的交易時段內&#xff08;如國內上證50ET…

成品電池綜合測試儀:保障電池品質與安全的核心工具|深圳鑫達能

隨著新能源汽車、儲能系統、消費電子等領域的快速發展&#xff0c;電池作為核心能源組件&#xff0c;其性能與安全性直接關系到產品的整體質量與用戶體驗。成品電池綜合測試儀作為電池生產與質檢環節的關鍵設備&#xff0c;通過模擬真實使用場景&#xff0c;對電池的電氣性能、…

智慧工廠網絡升級:新型 SD-WAN 技術架構與應用解析

1. 智慧工廠對網絡的核心需求智慧工廠的網絡需求高度復雜&#xff0c;主要體現在以下幾個方面&#xff1a;高可靠性與低延遲工廠中的生產執行系統&#xff08;MES&#xff09;、設備監控系統&#xff08;如 PLC/SCADA&#xff09;、產品生命周期管理系統&#xff08;PLM&#x…

在 Windows 使用 Nginx/HAProxy 實現負載均衡

在本實驗中&#xff0c;我們將在 Windows 系統 上使用 Python 編寫一個 TCP 服務器&#xff0c;并啟動兩個服務實例。然后使用 Nginx 或 HAProxy 作為負載均衡器&#xff0c;將來自多個客戶端的請求分發到這兩個服務實例上&#xff0c;驗證負載均衡效果。 &#x1f9e9; 環境準…

【物聯網】基于樹莓派的物聯網開發【17】——物聯網通信協議MQTT基礎知識

使用背景 MQTT最初是為了解決物聯網&#xff08;IoT&#xff09;領域設備之間的低帶寬、高延遲、不穩定網絡連接等問題而設計的。 場景介紹 廣泛應用物聯網領域&#xff0c;數據實時傳輸&#xff0c;連接各種智能設備和應用的關鍵橋梁 MQTT簡介和概述 MQTT&#xff08;Message …

【qml-3】qml與c++交互第二次嘗試(類型方式)

背景&#xff1a; 【qml-1】qml與c交互第一次嘗試&#xff08;實例方式&#xff09; 【qml-2】嘗試一個有模式的qml彈窗-CSDN博客 【qml-3】qml與c交互第二次嘗試&#xff08;類型方式&#xff09; 還是qml學習筆記。 這次擱置太久了。其實不太會&#xff0c;還是以教程為主…

輸電線路觀冰精靈在線監測裝置:科技賦能電網安全的新利器

一、技術架構與工作原理輸電線路觀冰精靈在線監測裝置&#xff08;簡稱“觀冰精靈”&#xff09;是一款集成多源感知、智能分析、遠程通信于一體的專業化覆冰監測設備。其核心功能通過以下技術路徑實現&#xff1a;1. 數據采集模塊視覺識別系統&#xff1a;搭載工業級夜視攝像機…

Ubuntu22 上,用C++ gSoap 創建一個簡單的webservice

創建calc.h// calc.h // gSOAP 服務定義 int ns__add(double a, double b, double &result); int ns__subtract(double a, double b, double &result);創建my_server.cpp#include "soapService.h" #include "ns.nsmap" class MyService : public S…

Java(LinkedList和ArrayList底層分析)

LinkedList全面說明:LinkedList底層操作機制:LinkedList的方法:add():增加節點對象remove():刪除一個節點對象(默認刪除第一個節點對象)set():修改一個節點對象get():得到一個節點對象LinkedList的遍歷:增強for循環迭代器普通for循化LinkedList的源碼解讀:增加源碼:1. LinkedLi…

開源項目XBuilder的user邏輯

stores \ userquery-keys.ts 統一管理Vue Query&#xff08;TanStack Query的Vue適配版本&#xff09;緩存鍵&#xff0c;在下面的文件中復用index.ts 入口文件&#xff0c;統一用戶信息查詢signed-in.ts 登錄狀態管理、認證邏輯在用戶登錄后&#xff0c;系統頒發一個令牌&…

第十五章 SEO的簡單免費工具

SEO的基礎工具和檢測 前文中主要是講一些SEO的網站基本功&#xff0c;而在這一章那&#xff0c;會講到一些非常基本的工具&#xff0c;主要是關于&#xff1a;網站的流量、停留時長、關鍵詞密度、內容、以及Google的站長工具。 Google Search Console Google Search Console這是…

SSL 證書與 HTTPS 的關系:一文理清核心關聯

HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;和 SSL 證書&#xff08;Secure Sockets Layer Certificate&#xff09;是網絡安全的兩大基石&#xff0c;它們共同保障了互聯網通信的安全性和可信度。以下從定義、功能、關系及實際應用層面進行解析&#xf…

使用Jmeter參數化實現接口自動化測試

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 本文記錄如何使用Jmeter參數化&#xff08;csv)實現接口自動化——測試Token不同入參情況下&#xff0c;接口請求能夠返回正確的結果1. 首先需要使用Jmeter獲取一個…

X-plore File Manager v4.34.02 修改版:安卓設備上的全能文件管理器

在使用安卓設備時&#xff0c;文件管理是日常操作中不可或缺的一部分。X-plore File Manager 作為一款功能強大的文件管理器&#xff0c;憑借其豐富的功能和便捷的操作&#xff0c;成為安卓用戶管理文件的首選工具之一。最新版 v4.34.02 修改版更是解鎖了更多高級功能&#xff…

React+threejs兩種3D多場景渲染方案

在現代 Web 開發中&#xff0c;3D 可視化需求日益增長&#xff0c;特別是在 React 生態系統中實現多 3D 場景的展示與交互。本文通過對比兩種實現方案&#xff0c;探討 React 中構建多 3D 場景的最佳實踐&#xff0c;分析它們的技術特點、性能表現和適用場景。方案一&#xff1…

React性能優化終極指南:memo、useCallback、useMemo全解析

掌握 React.memo、useCallback、useMemo 的正確使用姿勢&#xff0c;讓你的 React 應用性能飛起來&#xff01; &#x1f3af; React.memo 作用 React.memo 是一個高階組件&#xff0c;用于函數組件&#xff0c;通過淺比較 props 的變化來決定是否重新渲染。如果 props 沒有變…

借助 VR 消防技術開展應急演練,檢驗完善應急預案?

應急演練是企業應對火災事故的重要手段&#xff0c;而 VR 消防技術的應用&#xff0c;為應急演練帶來了全新的體驗和更高的效率。VR 消防技術通過虛擬現實技術模擬逼真的火災場景&#xff0c;讓參與者能夠身臨其境地感受火災發生時的緊張氛圍。某知名物流企業&#xff0c;倉庫眾…

【電賽學習筆記】MaxiCAM 項目實踐——二維云臺追蹤指定目標

前言 本文是對視覺模塊MaixCam實現二維云臺人臉跟蹤_嗶哩嗶哩_bilibili大佬的項目實踐整理與拓展&#xff0c;侵權即刪。 單路舵機基本控制 #導入必要模塊 from maix import pwm, time , pinmap#定義全局變量&#xff0c;設初值 SERVO_FREQ 50 #主頻 SERVO_MIN_DUT…

深入解析 ArkUI 觸摸事件機制:從點擊到滑動的開發全流程

摘要 隨著 HarmonyOS NEXT 的不斷發展&#xff0c;ArkUI 逐漸成為主流的 UI 構建方式。而用戶交互在任何應用中都是基礎而又關鍵的一環&#xff0c;如何利用 ArkUI 提供的觸摸事件機制&#xff0c;如 onTouch、onClick、onSwipe 等&#xff0c;來實現自然、順滑、用戶友好的交互…