1. 程式人生 > >operator+單引數和雙引數的兩種寫法

operator+單引數和雙引數的兩種寫法

C++運算子過載在自定義類中經常會用到,比如當我們自定義一個點類Point,想對Point類物件進行加減比較判斷等操作時,就需要對相應運算子進行過載。

operator+為例,通常直觀的感覺運算元就是應該有兩個,寫法如下:

    Point operator+(const Point &p1,const Point &p2)const;//(會報錯)

關於上一句operator過載的格式宣告語句,這裡插一段題外話,懂的人直接跳過從“回到正題”開始看就好,不懂的可以參考一下:

這裡的&就不是取地址符了,關於&有必要說一下:

1&在變數定義區,表示引用,即引用實參:

void test(&xxx),那麼xxx為實參的一個別名,當在test函式內部修改xxx的值時,呼叫test的主程式中的xxx也會對應改變;

2&在變數操作區,才作取地址符;

至於引用前為什麼加了個const

先說const引用,簡單點說就是:const引用可以與常量或變數繫結,但是不能通過這個const引用來改變繫結物件的值,例如:

    int a = 1;
    const int &b = a;
    a = 5;//正確:執行後b的值也會從1變為5
    b = 4;//錯誤:無法編譯,報錯如下:


然後說一下為什麼引數要用const引用:因為

operator+()的返回值是一個臨時變數,當我們想進行連加操作時(a = b + c + d),b + c得到的臨時變數r1再與d相加,而臨時變數不能修改,所以需要以const引用的方式獲取到這個臨時變數

另外,對於函式結尾處的const,理解為:函式內部不可以修改資料成員的值,舉個例子:

class A {
    int num;
public:
    A() : num(0) {}
    void test1() const{
        num = 10;//報錯,因為被const修飾的函式不可以修改其資料成員
    }
};

回到正題,如果按照上邊的寫法,寫兩個輸入引數的話,就會報錯如下:


這是為什麼呢?原來,成員函式有this指標,物件本身的成員資料作為一個加數,看一下下面這個例子就很清楚了:

class Point1 {
    int x;
    int y;
    Point1() : x(0), y(0) {}
    Point1(int _x, int _y) : x(_x), y(_y) {}
    Point1 operator+(const Point1 &t) const{
        Point1 temp;
        temp.x = this->x + t.x;
        temp.y = this->y + t.y;
        return temp;
    }
};

那麼,可不可以寫兩個引數呢?完全可以呀,只要把函式宣告成友元就可以了,友元函式沒有this指標,所以引數會多一個,寫法參考如下:

class Point2 {
    int x;
    int y;
    Point2() : x(0), y(0) {}
    Point2(int _x, int _y) : x(_x), y(_y) {}
    friend Point2 operator+(const Point2 &t1, const Point2 &t2) {
        Point2 temp;
        temp.x = t1.x + t2.x;
        temp.y = t1.y + t2.y;
        return temp;
    }
};

那麼總結一下,運算子過載其實有兩種方法:成員函式和友元函式,成員函式一引數,友元函式兩引數,成員函式宣告結尾有const,友元函式宣告結尾無const(非成員函式上不允許使用型別限定符)



相關推薦

python統計文本中的詞數print的寫法

for Coding split() number err app split exc words #!/usr/bin/python # - * - coding: utf-8 - * - #作用,分別計算每個文本的單詞數,並且輸出所有文本的單詞總數 a = [] sum

operator+引數引數寫法

C++運算子過載在自定義類中經常會用到,比如當我們自定義一個點類Point,想對Point類物件進行加減比較判斷等操作時,就需要對相應運算子進行過載。 以operator+為例,通常直觀的感覺運算元就是應該有兩個,寫法如下: Point operator+(co

Linux安裝(虛擬機器系統方法)

一、VMware虛擬機器 1.下載並安裝VMware: ①https://my.vmware.com/cn/web/vmware/free#desktop_end_user_computing/vmware_workstation_player/15_0 ②下載Ubuntu映象檔案:http

前端from表中action屬性值得寫法

1. 直接寫後端定義好的路徑urlurlpatterns = [ url(r'^register/$',register), ]<form action='/register/' method='post'></form>   缺點:當後端給定

jQuery使用serialize(),serializeArray()方法取得表資料+字串物件型別提交的方法

原始form表單值獲取方式(手動):$.ajax({ type: "POST", url: "ajax.php", data: "Name=摘取天上星&position=IT技

uboot傳遞新引數到kernel的方式

第一:         寫新引數到bootargs,驅動中用__setup(“新引數名=”, function)註冊自定義函式解析新引數“=”後的字串,再使用EXPORT_SYMBOL()匯出。 第二:         自定義新引數到uboot環境變數中,uboot中使用g

CSS3中transition-duration引數對hover前後過渡時間的影響

transition-duration這個引數是設定過渡時間的,將transition-duration放在哪個類中,那麼在這個類被啟用時就會按照transition-duration設定的時間來過渡

二叉樹的四遍歷方式:遞迴、非遞迴+棧、Morris(後序非遞迴還有一棧的不同版本)

本文參考: 參考文章1 參考文章2 程式碼中加入了一些自己的理解 /* 二叉樹的四種遍歷方式 */ #include <iostream> #include <stack> using namespace std; // 二叉樹

php裏引的用法區別連接符(.)

jce 編譯器 last 進行 一個 tar 字串 string clas " "雙引號裏面的字段會經過編譯器解釋,然後再當作HTML代碼輸出。 ‘ ‘單引號裏面的不進行解釋,直接輸出。 例如: $abc=‘my name is tome‘; echo $abc //結果是

PHP中對變量使用引號引號的區別

輸出 ext tex 執行 class 單引號 如果 -1 雙引號 單引號內部的變量不會執行雙引號會執行如$name = ‘hello‘;echo "the $name";會輸出 the hello而如果是單引號$name = ‘hello‘;echo ‘the $name

瀏覽器原生 form 表POST 數據的方式

mes 但是 lba lose -s ipa mvm 默認 字串 我們在提交表單的時候,form表單參數中會有一個enctype的參數。enctype指定了HTTP請求的Content-Type。 常用有兩種:application/x-www-form-urlencod

HTML5HLS協議技術完美結合解決移動端網頁播放問題

html5 hls、網頁直播 什麽是HTML5 我們需要先了解一下HTML是什麽。HTML的英文全稱為Hyper Text Markup Language,即超文本標記語言。HTML5是HTML的一個新版本。HTML 不是一種編程語言,而是一種標記語言 (markup language)。HTML5

C/SB/S架構區別與優缺點分析

iis 持久化數據 邏輯 刷新 lamp 滿足 tle 擴展 區別 C/S和B/S,是再普通不過的兩種軟件架構方式,都可以進行同樣的業務處理,甚至也可以用相同的方式實現共同的邏輯。既然如此,為何還要區分彼此呢?那我們就來看看二者的區別和聯系。 一、C/S 架構

JS中的引號引號

ont 進行 成對 在外 可讀性 編譯 afa 來看 遇到 JS裏面的單引號和雙引號可以同時使用,但是要遵循一定的準則。 最外面用了雙引號了,那麽裏面就不能再用雙引號了,因為引號是成雙對的,瀏覽器讀到一個雙引號後,到第2個雙引號時才算結束;同理,瀏覽器讀到一個單引號後,必須

引號引號的區別、linux快捷鍵、zip壓縮、lrzsz、vim常見問題

linux 快捷鍵 zipDay11-12-21怎麽去記憶?大腦: 意識 == 內存 潛意識 === 硬盤如何將知識放到潛意識中:1. 交流討論 - - 說出來 睡覺前,把當天學的內容和復習的內容,以語音的形式表達出來。 微信群裏說出來。 自學知識點,分享給大家。2. 畫圖表達出來 本章正題:單引

在C#中使用SQL語句什麽情況需要使用‘引號’引號”

sql 一行 情況 values log 雙引號 table 引號 insert 例如 string sql = " insert into [Demo].[dbo].[textable] (姓名,身份證號)values (‘" + name.Text.ToString(

C之引號引號(十三)

C語言 單引號 雙引號 在 C 語言中,我們會經常使用到單引號和雙引號。那麽單引號用來表示字符字面量,雙引號是用來表示字符串字面量。 'a' 表示字符字面量,在內存中占1個字節; 'a' + 1表示 'a' 的 ASCI

centos6.5 通過yum源碼方法升級安裝內核

centos升級內核 yum安裝內核 源碼安裝內核 centos6.5 2.6.32yum方式安裝內核是安裝的最新版內核,不能選擇內核版本源碼方式安裝可以選擇內核版本進行安裝,源碼方式安裝較慢。 yum方式升級內核:cd /etc/yum.repos.d/下載導入公鑰wget --no-

C語言查漏補缺——引號引號

C語言 一直對於單引號和雙引號有些混淆,本節討論一下單引號和雙引號的問題。一、基本知識 1、C語言中單引號用來表示字符字面量 2、C語言中雙引號用來表示字符串字面量 比如:'a'表示字符字面量,在內存中占1個字節, 'a'

go--->共享內存通信並發模式原理探究

表現 cond 原理 second chan listen 今天 想象 unlock 共享內存和通信兩種並發模式原理探究 並發理解 人類發明計算機編程的本質目的是為了什麽呢?毫無疑問是為了解決人類社會中的各種負責業務場景問題。ok,有了這個出發點,那麽想象一下,比如你既可