[問題] 函數回傳const reference to object

看板C_and_CPP (C/C++)作者 (老粗)時間14年前 (2011/08/14 14:05), 編輯推噓2(2017)
留言19則, 3人參與, 最新討論串1/1
測試環境: Dev C 各位好~小弟我最近在書上看到一個簡單例子 類似儲存日期功能 其中有一個operator overloading的函數(operator+=) 回傳了物件的 const reference (問題處有用顏色標示) 不太懂那樣的目的為何 我將程式重新精簡過後如下 ===========================Date.h======================================= #include <iostream> using std::ostream; class Date { friend ostream &operator<<( ostream &,const Date &); public: Date( int d=1); Date &operator++(); const Date &operator+=(int); private: int day; void inc(); }; ========================================================================= ===========================Date.cpp====================================== #include <iostream> #include "Date.h" Date::Date(int d) { day=d; } Date &Date::operator++() { inc(); return *this; } const Date &Date::operator+=(int add)////我想問的地方 { for (int i=0;i<add;i++) inc(); return *this; } void Date::inc() { day++; } ostream &operator<<( ostream &output,const Date &d) { output<<d.day; return output; } ========================================================================== 謝謝!!! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.230.228.195 ※ 編輯: enjoylife66 來自: 61.230.228.195 (08/14 14:11) ※ 編輯: enjoylife66 來自: 61.230.228.195 (08/14 14:13)

08/14 14:17, , 1F
int a = 1, b = 2; 執行 a += b += 3; 其中因為右結合性
08/14 14:17, 1F

08/14 14:18, , 2F
整數 (物件) b 先跟數值常數 3 相加而改變自身...然後傳回
08/14 14:18, 2F

08/14 14:18, , 3F
另外一個 interger literal 也就是 5 給 a 物件
08/14 14:18, 3F

08/14 14:19, , 4F
所以 5 必須是 const
08/14 14:19, 4F

08/14 14:22, , 5F
我想他的疑惑是, ++:ref., +=:const ref,為何是 C.R.
08/14 14:22, 5F

08/14 14:25, , 6F
感謝一樓! 原來是為了要這樣!
08/14 14:25, 6F

08/14 14:26, , 7F
所以return回來的const是暫時物件而不是物件本身嗎?
08/14 14:26, 7F

08/14 14:30, , 8F
他還是會回傳跟這個物件,狀態都一樣,只是不能修改
08/14 14:30, 8F

08/14 14:31, , 9F
承一樓的例子,就實際狀況上,是可以 (a = 3)++; 使最後 a
08/14 14:31, 9F

08/14 14:31, , 10F
a 的值變成 4。但這個 Date 因為是 const 就不能像 a 一樣
08/14 14:31, 10F

08/14 14:31, , 11F
之後再拿回傳值去做一個 postfix ++ 來改變自身狀態的動作
08/14 14:31, 11F

08/14 14:42, , 12F
我一開始以為d1+=1這樣d1就變成const
08/14 14:42, 12F

08/14 14:43, , 13F
然後再不同行在(d1+=1)一次仍是可以的
08/14 14:43, 13F

08/14 14:44, , 14F
不過(d1+=1)+=1這樣就不行
08/14 14:44, 14F

08/14 14:46, , 15F
然後剛剛試出這const的用意~有的話就不能++(d1+=1)
08/14 14:46, 15F

08/14 14:47, , 16F
應該是為了不要在同一條命令式中不小心改到??
08/14 14:47, 16F

08/14 14:58, , 17F
只是一種策略選擇,我是看不出非得要選哪種不可
08/14 14:58, 17F

08/14 14:59, , 18F
(d1+=1).呼叫月日對調函數(); -> 失敗
08/14 14:59, 18F

08/14 16:26, , 19F
謝謝您!
08/14 16:26, 19F
文章代碼(AID): #1EHsN3Os (C_and_CPP)
文章代碼(AID): #1EHsN3Os (C_and_CPP)