1. 程式人生 > >C++_運算子過載的注意事項

C++_運算子過載的注意事項

1、過載操作符沒必要一定是成員函式,還可以是友元函式。

2、過載操作符函式為成員函式主要是你需要操作類內部的成員,
必須是成員函式或友元函式才行。

3、至於由深淺拷貝的原因要使其成為成員函式,這個不知道。

4、如果運算子被過載為全域性函式,那麼只有一個引數的運算子叫做一元運算子,有兩個引數的運算子叫做二元運算子。

如果運算子被過載為類的成員函式,那麼一元運算子沒有引數,二元運算子只有一個右側引數,因為物件自己成了左側引數。

從語法上講,運算子既可以定義為全域性函式,也可以定義為成員函式。文獻[Murray , p44-p47]對此問題作了較多的闡述,並總結了表8-4-1的規則。




運算子
規則

所有的一元運算子
建議過載為成員函式

= () [] ->
只能過載為成員函式

+= -= /= *= &= |= ~= %= >>= <<=
建議過載為成員函式

所有其它運算子
建議過載為全域性函式

第四點來自  http://shake863.iteye.com/blog/213590

簡單地說,C++標準規定要這樣使用,但為什麼要這樣規定,請看下面:

1:對於賦值操作符(=)--比較特別,因為任何類如果不提供顯示的拷貝賦值(即過載=),則編譯器會隱式地提供一個。這樣的話,如果你再通過友元宣告,進行全域性的定義會造成呼叫二義性(即使允許,編譯也會出錯)。



2:對於所有樓主提到的操作符(=,[],(),->),只能宣告為成員函式是為了避免不合法的書寫通過編譯(這是推測出的原因,更深層的可能要研究 C++ 的設計了)。這涉及到 C++ 中型別的隱式轉換。下面通過程式碼例子說明:

C/C++ code ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #include <iostream> class  { public: X(){} X(int){} // int 型別可以被隱式轉換成 X friend bool operator<(const X& x1, const X& x2) { return true; } // 只是測試,無意義 }; class  { public: Y(){} Y(int){} // int 型別可以被隱式轉換成 Y

相關推薦

C++_運算子過載注意事項

1、過載操作符沒必要一定是成員函式,還可以是友元函式。 2、過載操作符函式為成員函式主要是你需要操作類內部的成員, 必須是成員函式或友元函式才行。 3、至於由深淺拷貝的原因要使其成為成員函式,這個不知道。 4、如果運算子被過載為全域性函式,那麼只有一個

C#中運算子過載的幾點注意

這是一篇簡記,因此不做特別的排版 1、運算子過載不能多型 這是最容易出問題的地方,看下面的程式碼 過載者如下: public class Father { public int value; public static implicit operat

object-c的property有關注意事項

自定義setter和getter,標識無效 property僅僅是為了幫你節省setter和getter兩個函式, 通過指定atomic、strong之類的標識,xcode幫你自動生成相應不同的setter和getter函式。 所以,如果你自己寫setter和getter,則atom

C++ 函式返回指標注意事項

C++ 不支援在函式外返回區域性變數的地址,除非定義區域性變數為static 變數。 #include <iostream> #include <ctime> #include <cstdlib> using namespace std; /

C/C++】運算子過載

C++ 中允許programmer 根據自身需要過載一系列的運算子,比如過載==運算子就比定義 equals() 函式名了的多。但是儘量不要過載表意不明的運算子。 常用的過載運算子有 : =, ==, <,>, <<, >>

G++和C++區別和評測注意事項

G++和C++的區別和評測注意事項 下面摘抄自網際網路 G++ 首先更正一個概念,C++是一門計算機程式語言,G++不是語言,是一款編譯器中編譯C++程式的命令而已。 那麼他們之間的區別是什麼? 在提交題目中的語言選項裡,G++和C++都代表編譯的方式。準確地說

四數問題下邏輯運算子注意事項

給定一個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。 注意:答案中不可以包含重複的三元組。 例如, 給定陣列 nums = [-1, 0, 1, 2, -1, -

c++11 中的注意事項

1. C++11標準中讓類的解構函式預設也是noexcept(true)的。 但如果顯式地為解構函式指定了noexcept,或者類的基類或成員有noexcept(false)的解構函式,解構函式就不會再保持預設值。 2. 初始化成員變數: c++98中,支援在類宣告中使用等號“=”進行初始化,但要求必須為

c++成員運算子過載和友元運算子過載的比較(以++,--運算子為例)

1、對雙目運算子而言,成員運算子過載函式引數列表中含有一個引數,而友元運算子過載函式引數列表含有兩個引數;對單目運算子而言,成員運算子過載函式引數列表中沒有引數,而友元運算子過載函式引數列表含有一個引數。 2、雙目運算子一班可以被過載為友元運算子和成員函式運算

Unity呼叫c++動態連結庫注意事項

Unity通過ndk呼叫java,java通過jni呼叫c++ .so 1:Jni的.so是獨立的,還是依賴其他.so庫或靜態庫? 答:都可以,但具體的.so拷貝到unity中後,是否還能正常呼叫,有待測試。 2:C++中jni與java回撥函式,這裡只舉例靜態函式呼叫

C++哪些運算子過載可以過載

運算子過載是C++極為重要的語言特性之一,本文將用程式碼例項回答——C++哪些運算子可以過載?如何過載?實現運算子過載時需要注意哪些? 哪些運算子可以過載,哪些不可過載? C++98,C++0x,C++11對“哪些運算子過載可以過載”有一致的規定,具體如下: 其中,很少

C++的運算子過載

C++中預定義的運算子的操作物件只能是基本資料型別。但實際上,對於許多使用者自定義型別(例如類),也需要類似的運算操作。這時就必須在C++中重新定義這些運算子,賦予已有運算子新的功能,使它能夠用於特定型別執行特定的操作。運算子過載的實質是函式過載,它提供了C++的可擴充套

C#SHA1演算法及注意事項

要求:使用hash演算法SHA-1計算字串的hash值,得到16進位制形式的字串(共40個字母),並全部轉換為英文字母大寫形式。 上面的要求也就是標準SHA1的結果再轉為大寫 SHA1線上加密演算法工具:http://tool.oschina.net/enc

作業11: 類_運算子過載

作業11:  類_運算子過載1.設向量X = ( x1 ,x2 ,x3) 和 Y = ( y1 , y2 ,y3 ),則它們之間的加、減和積分別定義為:X + Y = ( x1 + y1 , x2 + y2 , x3 + y3 ) X - Y = ( x1 - y1 , x2

C#呼叫C++dll方法和注意事項

在實際C#開發專案中,存在如下兩種情況 C#呼叫第三方庫,而第三方庫是使用C++編寫的; 牽涉到專案原始碼保密,C#程式碼容易被反編譯,因此抽取核心演算法部分使用C++編寫 這時候就涉及C#託管程式碼與C++非託管程式碼互相呼叫。 本文介紹C#呼叫C++的方法以及在C#

C/C++ 中的sizeof注意事項

轉自 原文連結:http://blog.csdn.net/w57w57w57/article/details/6626840 摘要:、 Sizeof的作用非常簡單:求物件或者型別的大小。然而sizeof又非常複雜,它涉及到很多特殊情況,本篇把這些情況分門別類,總

C++類使用常用注意事項

在普通的非const成員函式中,this的型別是一個指向類型別的const指標。可以改變this所指向的值,但不能改變this所儲存的地址。 在const成員函式中,this的型別是一個指向const類型別物件的const指標。既不能改變this所指的對戲,也不能改變thi

C# 訪問SafeNet加密鎖注意事項

第一步:專案引用 hasp_net_windows.dll 檔案 第二步:在System32 和 SysWOW64資料夾根目錄下加入apidsp_windows.dll 和 apidsp_windows_x64.dll 第三步:程式執行根目錄下放定製的系統dll 

前端_頁面重構注意事項

頁面重構要注意一下幾點: 不濫用id,儘量用class代替id。CSS選擇器最好控制在2-3個以內,不要使用內聯樣式,轉移到樣式表中。根據上下結構命名id和class,而不是設計元素,避免html結構

C++回顧——運算子過載

運算子過載只是一種語法上的方便,實際上它是另一種函式呼叫的方式,其不同之處在於函式的引數不是出現在圓括號內,而是緊貼在一些字元旁邊;呼叫運算子時要把運算子放置在引數之間、引數之後、引數之前;編譯器決定呼叫哪一個“函式”。 在C++中,可以定義一個處理類的新運算