「operator運算元」的推薦目錄:
operator運算元 在 大象中醫 Youtube 的最讚貼文
operator運算元 在 大象中醫 Youtube 的精選貼文
operator運算元 在 C語言的Bitwise operator(位元運算子)介紹, 包含圖解及範例 的推薦與評價
這次影片介紹C語言的Bitwise operator (位元 運算 子)的用法及如何將某個bit設成1或設成0, 或將0,1切換(toggle).課程裡面的範例程式原始碼可從以下連結 ... ... <看更多>
operator運算元 在 Dart:會用但不會講的運算子 - Jonny Huang 的學習筆記 的推薦與評價
前言**運算子(Operator)可以說是程式語言最重要的功能之一,但是回想起來一開始學程式時卻是有點痛苦的回憶,因為它跟我們所學的數學邏輯有點像又有些 ... ... <看更多>
operator運算元 在 Re: [問題] 運算子多載一問- 看板C_and_CPP - 批踢踢實業坊 的推薦與評價
※ 引述《d630200x (DOGE)》之銘言:
: 在一般運算子多載中的宣告為下
: 傳回型別 operator運算子符號(.....)
: 然而看到比如要多載++前置或者是右移運算子>>時
: 宣告會變成
: 傳回型別& operator運算子符號(.....)
: 個人不太能理解這個&的意義,翻來翻去也沒有找到解答
首先先確定知道回傳的資料型別為 T& 時,& 表示其回傳的是 reference (參考)
因此其回傳的應為其中一個運算元的本尊,而非暫時物件,不然就會無中生有
下去的問題就變成什麼時候要傳本尊,什麼時候要產生暫時物件
這個跟我們期望這個運算子怎麼作用有關
以 a + b 的結果來說,回傳 a 本尊或 b 本尊都極其不合理.
因為這不只意味著 a + b 計算完之後其結果會存在 a 或 b 上,
也意味著 a + b = 3 這寫法是合法的 (你可以試著寫寫看)
你應該不會期望做完 a + b = 3 之後,是 a 或 b 其中一個會變成 3 吧
可以想成如果每次都回傳一個暫時物件表示計算結果是最簡單的,T& 反而麻煩
但是這樣會遇到一些困難:
1. 語意問題
int a = 3;
int b = 0;
int &c = b = a;
如果我們要讓這語法合法的話,b = a 的計算結果,也就是 operator= 必須回傳 b 本尊
這造就了基本上所有賦值運算都必須要回傳 T&
相對的,因為 ++b 也是種賦值運算
int &c = ++b;
要合法的前提也是 operator++ (pre-) 需要回傳 T&
operator++ (post-) 反而是例外,因為其回傳值與本尊的值就不一樣
int &c = b++; // 這邊的 c 參考的會是 +1 之前的 b,要嘛語意不合理,要嘛無中生有
2. 連鎖呼叫時的複製問題
當你有一種類別物件支援某種可以連鎖呼叫的運算子時,可能會在複製的時候發生問題
例如 cout << a << b << c << d << e;
在語意上是希望達到
cout << a; cout << b; cout << c; cout << d; cout << e;
的效果
這就必須讓 operator<< 的回傳值與其中一個運算元 (cout) 相同
於是我們一方面可能需要回傳時每次都複製一次 cout 造成效率問題,
另一方面也許 cout 根本就因為運作特性不能複製.
或者你根本期望他套用在同一個物件上
因此選擇回傳其中一個運算元 (cout) 的本尊 (reference, T&) 是最適當的方式
就結論來說,C++ 並沒有嚴格要求你是不是要回傳 reference
運算子多載重要的是讓使用者直覺的操作,不要做出不預期的運算
在考量使用者可能的使用情境後,選擇最適當的設計
--
以上都是我的猜想,如果哪裡有什麼問題再麻煩回覆討論一下~
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.122.83.198
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1529243086.A.226.html
※ 編輯: Feis (140.122.83.198), 06/17/2018 22:11:35
... <看更多>