C++(16)--運算符重載(自定義Integer類)

運算符重載

  • 1.運算符重載--重點
  • 2.友元函數--難點(流運算符重載)

《老九學堂C++課程》《C++ primer》學習筆記。《老九學堂C++課程》詳情請到B站搜索《老九零基礎學編程C++入門》
-------------簡單的事情重復做,重復的事情用心做,用心的事情堅持做(老九君)---------------

C++創始人:要輕松的使用這種語言,不要覺得必須使用所有的特性,不要在第一次學習的時候就試圖使用所有的特性。

1.運算符重載–重點

1.函數的重載和參數有關,和函數名無關。
2.運算符重載就是“想法的轉換”,它的目標是簡化函數調用的方式。
3.把標準的函數使用方式,重新定義成自己認為的方式。給符號賦予新的含義,使得一個運算符可以擁有不同的功能。

實際上:我們已經用過了很多運算符的重載,C++本身已經對這些運算符進行了重載

  1. +號可以實現不同類型數據的加法操作。
  2. << 既是位移運算符,又可以配cout 實現控制臺數據的輸出

兩個對象想要進行相加,必須進行運算符重載。重載的一個效果是為了是為了美觀

小試牛刀:定義一個運算符重載,就像是定義了一個函數,只不過這個函數名稱以關鍵字operator開頭.

運算符重載的語法格式為:

返回類型 operater被重載的運算符(參數列表)

編譯器實際調用:

num3 = num1.operator+(num2);

demo1:重載加法運算符1

//mian.cpp
#include <iostream>
#include "Integer.h"
using namespace std;
void TestInteger();
void TestIntefer()
{Integer int1(1024), int2(2048),int3;int3 = int1 + int2;cout << "int3 = int1 + int2的結果為" << int3.Intvalue()<< endl;
}
int main() {TestIntefer();return 0;
}
//Integer.h
//
// Created by 陳瑩瑩 on 2021/2/14.
// 我們自己定義的整型類,將整型封裝成類,以便面向對象的封裝#ifndef CHAPTER12_INTEGER_H
#define CHAPTER12_INTEGER_Hclass Integer {
public:Integer();Integer(int value):m_value(value){}// 重載加號運算符Integer operator+(Integer other);int Intvalue(){return m_value;}~Integer();
private:int m_value; // 實際的整型數字,提供一些十分方便操作的函數};
//Integer.cpp
//
// Created by 陳瑩瑩 on 2021/2/14.
//#include "Integer.h"
//調用默認構造時會為m_value賦一個默認值為0
Integer::Integer():m_value(0)
{//ctor
}
Integer Integer::operator+(Integer other)
{Integer result(this->m_value + other.m_value);  // 加法的結果,返回return result;
}
Integer::~Integer()
{//dtor
}

demo2:重載加法運算符2–()

    // 重載加號運算符2--對應的.cpp 需要改變// const Integer &operator+(const Integer & other) const;const Integer operator+(const Integer & other) const;// 第一個const 修飾返回值,返回值用引用更好(報錯,不返回引用)// 第二個const 修飾參數,傳遞的是參數的引用,并且不希望改變參數// 第三個const 不修改當前的成員變量
//Integer.cpp
const Integer Integer::operator+(const Integer & other) const
{Integer result(this->m_value + other.m_value);  // 加法的結果,返回return result;
}

可以被重載的運算符包括所有的C的運算符,可以重載的運算符列表如下

二遠運算符+,-,*,/,%
關系運算符==, !=, <, >, <=, >=
邏輯運算符
一元運算符+正, -負, *(指針), &(取地址), ++(自增), --(自減)
位運算符&,
賦值運算符=, +=, -=, *=, /=, %=, &=,
內存聲明與釋放new, delete, new[], delete[]
其他運算符()(函數), ->(成員訪問), ->*(成員指針訪問), ,(逗號), [](下標)

不能被重載的運算符

.點運算符
*成員指針訪問運算符
::域運算符
sizeof長度運算符
?:三元運算符

預算符重載的注意點:
1.重載不能修改運算變量的個數
2.重載不能修改運算符的優先級別
3.重載不能修改運算順序

(運算符重載先聽一遍,之后需要的化買《Effective C++》(更高效的C++)再看)
在條款10:重載賦值運算符(復合賦值符號)的建議用法:返回*this。返回一個新建對象也可以,但是不夠高效。
在條款11: 如果是自我賦值,就不要做任何事情。

2.友元函數–難點(流運算符重載)

Integer num1(1024), Integer num2(24);
Integer num3 = num1 + num2; // 正常執行
Integer num4 = 1024 + num1; // 編譯錯誤。 因為int 類型中沒有重載+ 號

使用友元函數,重載運算符時加一個friend關鍵字。 可以直接訪問類的私有成員。
(僅摘錄相關代碼)
demo: 友元函數重載,+,流運運算符

//main.cppInteger int5;// int5 = int4 + 1024;    // 沒有實現友元函數也能夠運行的寫法int5 = 1024 + int4;       // 加了友元函數才能過cout << "int5 = " << int5.Intvalue() << endl;// 重載流運算符--可以實現封裝某個對象的打印格式cout << "重載了流運算符,可以直接打印對象" << int5 << endl;Integer int6;cin >> int6;cout << "輸入的int6為:" << int6;
//Integer.h// 友元函數--friendfriend const Integer operator+(int intValue, const Integer & other);  // 最后不能加const會報錯// 重載流運算符--一般只能使用友元的方式,返回值插入流,會變所以不用const 修飾返回值friend ostream & operator<<(ostream & out, const Integer & num);friend istream & operator>>(istream & in, Integer & num);
//Integer.cpp
// 友元函數不需要使用域運算符號
const Integer operator+(int intValue, const Integer & other){cout << "使用友元方式重載了+運算符,實現int類型和Integer類型的相加" << endl;return Integer(intValue + other.m_value);  // 返回了一個新的Integer對象
}
ostream & operator<<(ostream & out, const Integer & num){out << num.m_value;return out;
}
istream & operator>>(istream & in, Integer & num){cout << "請輸入一個整數:" ;in >> num.m_value;return in;
}
運算符聲明成類成員還是聲明成獨立友元函數的建議準則
必須聲明為成員函數賦值預算符=、數組下標預算符[]、函數調用運算符()、成員訪問運算符->
必須聲明為友元函數流預算符>>、<<、類型轉換運算符
一般聲明為友元函數一元運算符、復合賦值運算符
一般聲明為友元函數二元運算符

注意:

  1. 剩下的預算符可以友元也可以成員函數重載
  2. 必須選擇一種方式,避免二義性,參數列表不同就是不同的兩個重載
  3. 沒有絕對的好壞,按上表建立來就可以。

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

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

相關文章

反應器組件 ACE_Reactor

6.1 反應器組件 ACE_Reactor反應器的基本原理是: 針對關心的某個事件寫一個事件處理器(event_handler). 將該事件處理器登記到反應器中(同時指明關心的事件). 然后反應器會自動檢測事件的發生. 并調用預先登記的事件處理器中的回調函數. 所以ACE Reactor 框架的責任&#x…

C++(17)--詳解const

詳解const《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》-------------簡單的事情重復做&#xff0c;重復的事情用心做&#xff0c;用心的事情堅持做(老九君)---------------1.const修飾成員變量 2.const修飾函數參數 3.c…

cppcheck的安裝和使用

首先從這里下載linux版本的:http://sourceforge.net/projects/cppcheck/files/cppcheck/ 然后下載對應的版本,解壓,之后安裝: 編譯: g++ -o cppcheck -Ilib cli/*.cpp lib/*.cpp 安裝: make install

leetcode24 兩兩交換鏈表中的節點

給定一個鏈表&#xff0c;兩兩交換其中相鄰的節點&#xff0c;并返回交換后的鏈表。 你不能只是單純的改變節點內部的值&#xff0c;而是需要實際的進行節點交換。 示例: 給定 1->2->3->4, 你應該返回 2->1->4->3. 思路&#xff1a;這一看就是個遞歸定義&…

再議指針和引用的一些事情吧

關于指針和引用一直是學習C++的同學們爭論的焦點,什么時候用指針,什么時候用引用,還有怎么引用數組,這么用指針訪問數組,以及初始化的問題。 不過有一些文章我在很早就已經寫過,但是由于當時時間不充分,自己也都是隨性寫的,可以參看以前我的一個文章:http://blog.csd…

C++(18)--復制構造函數

復制構造函數《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》-------------簡單的事情重復做&#xff0c;重復的事情用心做&#xff0c;用心的事情堅持做(老九君)---------------包裝基本類&#xff0c;封裝一些算法。 需求…

lua與C++粘合層框架

一. lua調用C 在lua中是以函數指針的形式調用函數, 并且所有的函數指針都必須滿足如下此種類型: typedef int (*lua_CFunction) (lua_State *L);   也就是說, 偶們在C中定義函數時必須以lua_State為參數, 以int為返回值才能被Lua所調用. 但是不要忘記了, 偶們的lua_State是…

leetcode147 對鏈表進行插入排序

丟人&#xff0c;我就是按插入排序老老實實寫的啊。。。。 別人肯定map了hhh。 對鏈表進行插入排序。 插入排序的動畫演示如上。從第一個元素開始&#xff0c;該鏈表可以被認為已經部分排序&#xff08;用黑色表示&#xff09;。 每次迭代時&#xff0c;從輸入數據中移除一個…

PaperNotes(13)-Conditional Image Generation with PixelCNN Decoders

conditional Image generation with PixelCNN DecodersICML的best paperpixel cnn 屬于完全可見的信念網絡&#xff0c;需要對 概率密度 建模。給定圖像數據x&#xff0c;想要對概率分布p(x)建模。概率分布p(x)可以看做&#xff0c;每一像素分布同時作用結果的一個聯合分布。一…

Expression : invalid operator 解決方法

從技術上說&#xff0c;用于排序關聯容器的比較函數必須在它們所比較的對象上定義一個“嚴格的弱序化(strict weak ordering)”。&#xff08;傳給sort等算法的比較函數也有同樣的限制&#xff09;,就是兩個對象比大小或先后的規則&#xff0c;比如兩個 string對象比大小的規則…

leetcode23 合并K個排序鏈表

合并 k 個排序鏈表&#xff0c;返回合并后的排序鏈表。請分析和描述算法的復雜度。 示例: 輸入: [ 1->4->5, 1->3->4, 2->6 ] 輸出: 1->1->2->3->4->4->5->6 思路&#xff1a;把初始的每一個鏈表當成數組中的一個數&#xff0c;做…

Xcode LaunchImage 載入界面大小設置

iPhone Portrait iOS 8-Retina HD 5.5 (12422208) @3x iPhone Portrait iOS 8-Retina HD 4.7 (7501334) @2x iPhone Portrait iOS 7,8-2x (640960) @2x iPhone Portrait iOS 7,8-Retina 4 (6401136) @2x iPhone Portrait iOS 5,6-1x (320480) @1x iPhone Portrait iO…

leetcode237 刪除鏈表中的節點(你意想不到的做法,注意細節)

請編寫一個函數&#xff0c;使其可以刪除某個鏈表中給定的&#xff08;非末尾&#xff09;節點&#xff0c;你將只被給定要求被刪除的節點。 現有一個鏈表 -- head [4,5,1,9]&#xff0c;它可以表示為: 示例 1: 輸入: head [4,5,1,9], node 5 輸出: [4,1,9] 解釋: 給定你鏈…

cppcheck值得注意的一些篩選項

使用完cppcheck進行C代碼檢測之后&#xff0c;可能篩選起來很麻煩&#xff0c;一般常見的優化有 emptiness&#xff0c;就是當你使用stl的時候&#xff0c;最好用empty替代size 還有就是 leak

C++(19)--自定義Array,vector練習

自定義Array,vector1.自定義Array2.自定義vector《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》-------------簡單的事情重復做&#xff0c;重復的事情用心做&#xff0c;用心的事情堅持做(老九君)---------------1.自定義…

讓cocos2dx支持并通過arm64 編譯

為了要支持64位,請把這個文件直接替換到對應的lib目錄下,本來是需要改neton_matrix_impl.c里的宏定義, 在 platform/ios/EAGLVIEW.mm中 在neon_matrix_impl.c中修改 #if defined(__ARM_NEON__) 為#if defined(_ARM_ARCH_7) 還有 third_party目錄下的curl的支持。

springboot——概述

Spring Boot 介紹 Spring Boot 是由 Pivotal 團隊提供的全新框架&#xff0c;其設計?的是?來簡化新 Spring 應? 初始搭建以及開發過 程&#xff0c;該框架使?了特定的?式來進?配置&#xff0c;從?使開發?員不再需要定義樣板化的配置。 默認配置了很多框架的使??式…

C++(20)--類型自動轉換

類型自動轉換1.C內置類型轉換2.實現自定義類的類型轉換《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》 -------------簡單的事情重復做&#xff0c;重復的事情用心做&#xff0c;用心的事情堅持做(老九君)---------------…

關于遍歷linux的文件目錄的坑- readdir

去年給公司寫了一個配置服務器,目的是解決運維的工作量太大,而且傳送服務器需要的配置文件需要腳本傳送到各個服(每個服ip不一樣,需要scp),然后再刷新通知各個GameServer,中間有沒有傳送失敗并不得知,而且維護相當麻煩,所以我寫了這個服務器,所有區服的配置都在這里邊…

終于,我讀懂了所有Java集合——sort

Collections.sort 事實上Collections.sort方法底層就是調用的Arrays.sort方法&#xff0c;而Arrays.sort使用了兩種排序方法&#xff0c;快速排序和優化的歸并排序。 快速排序主要是對那些基本類型數據&#xff08;int,short,long等&#xff09;排序&#xff0c; 而歸并排序用于…