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

2021-08-04 09:54:40 字數 1882 閱讀 7544

c++運算子過載在自定義類中經常會用到,比如當我們自定義乙個點類

point

,想對point

類物件進行加減比較判斷等操作時,就需要對相應運算子進行過載。

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

point operator+(const point &p1,const point &p2)const;//(會報錯)
關於上一句operator過載的格式宣告語句,這裡插一段題外話,懂的人直接跳過從「回到正題」開始看就好,不懂的可以參考一下:

這裡的&就不是取位址符了,關於

&有必要說一下: 1)

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

void test(&***)

,那麼***

為實參的乙個別名,當在

test

函式內部修改

***的值時,呼叫

test

的主程式中的

***也會對應改變;

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 

void test1() const

};

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

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

class point1 

point1(int _x, int _y) : x(_x), y(_y) {}

point1 operator+(const point1 &t) const

};

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

class point2 

point2(int _x, int _y) : x(_x), y(_y) {}

friend point2 operator+(const point2 &t1, const point2 &t2)

};

那麼總結一下,運算子過載其實有兩種方法:成員函式和友元函式,成員函式一引數,友元函式兩引數,成員函式宣告結尾有const,友元函式宣告結尾無

const

(非成員函式上不允許使用型別限定符)

引數和超引數

舉例說明一些機器學習演算法中的普通引數和超引數 機器學習演算法 普通引數舉例 超引數舉例 決策樹在每個節點上選擇的輸入變數 每個節點上選擇的閾值 每個葉節點所應包括的最少資料量,訓練後的剪枝 pruning 策略 隨機森林 同上決策樹的數量,輸入變數的數量 支援向量機 支援向量 support ve...

C 引數 預設引數和佔位引數

c 在宣告函式原型的時可為乙個或者多個指定預設的引數值,當函式呼叫的時候沒有給這個引數傳遞值,編譯器會自動用預設值代替 void test01 int x 100,int y 200 intmain 2.如果函式宣告和定義分開,函式宣告設定了預設引數,函式的定義不能在設定預設引數 void test...

gcc l引數和 L引數

l引數就是用來指定程式要鏈結的庫,l引數緊接著就是庫名,那麼庫名跟真正的庫檔名有什麼關係呢?就拿數學庫來說,他的庫名是m,他的庫檔名是libm.so,很容易看出,把庫檔名的頭lib和尾.so去掉就是庫名了 好了現在我們知道怎麼得到庫名,當我們自已要用到乙個第三方提供的庫名字libtest.so,那麼...