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,那麼...