operator+單引數和雙引數的兩種寫法
C++運算子過載在自定義類中經常會用到,比如當我們自定義一個點類Point,想對Point類物件進行加減比較判斷等操作時,就需要對相應運算子進行過載。
以operator+為例,通常直觀的感覺運算元就是應該有兩個,寫法如下:
Point operator+(const Point &p1,const Point &p2)const;//(會報錯)
關於上一句operator過載的格式宣告語句,這裡插一段題外話,懂的人直接跳過從“回到正題”開始看就好,不懂的可以參考一下:
這裡的&就不是取地址符了,關於&有必要說一下:
1)&在變數定義區,表示引用,即引用實參:
2)&在變數操作區,才作取地址符;
至於引用前為什麼加了個const:
先說const引用,簡單點說就是:const引用可以與常量或變數繫結,但是不能通過這個const引用來改變繫結物件的值,例如:
int a = 1;
const int &b = a;
a = 5;//正確:執行後b的值也會從1變為5
b = 4;//錯誤:無法編譯,報錯如下:
然後說一下為什麼引數要用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
HTML5和HLS協議兩種技術完美結合解決移動端網頁播放問題
html5 hls、網頁直播 什麽是HTML5 我們需要先了解一下HTML是什麽。HTML的英文全稱為Hyper Text Markup Language,即超文本標記語言。HTML5是HTML的一個新版本。HTML 不是一種編程語言,而是一種標記語言 (markup language)。HTML5
C/S和B/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,有了這個出發點,那麽想象一下,比如你既可