C/C++ 函式回傳參考用法 function return by reference

這篇主要想講 C++ 函式回傳參考 function return by reference 用法與用途。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Point {
public:
Point(int _x, int _y) : x(_x), y(_y) {
}

int& x() {
return x;
}

int& y() {
return y;
}

private:
int x = 0;
int y = 0;
};

用法1. 回傳參考(左值參考 lvalue reference)

point回傳的x或y是回傳參考型別,所以可以直接對它進行修改。

1
2
point.x() = 10;
point.y() = 30;

用法2

通常使用這種寫法時,是因為回傳物件的資訊很大,改用回傳參考(reference)會比回傳複本(copy)更有效率。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Window {
Point& getPosition() { // return reference
return position;
}
private:
Point position;
}

int main() {
Window w;
Point& pos = w.getPosition();
//Point pos = w.getPosition(); ?? 這樣可以編譯的過?如果可以,那是複本還是參考?

return 0;
}

用法3

C++14 基本上已經支援自動推導型別,使用auto的話編譯器就會自動幫你推導要回傳的類型。

1
2
3
4
5
6
7
8
9
10
auto& getPosition() {
return position;
}

int main() {
Window w;
auto& pos = w.getPosition();

return 0;
}

常見問題

不行回傳區域變數

1
2
3
4
Point& getPosition() {
Point (3, 5);
return p; // compile error
}

驗證回傳值參考

這邊做個實驗看看回傳參考的那份,是不是就是本來的那一份
第一個範例
https://www.geeksforgeeks.org/return-by-reference-in-c-with-examples/

參考
Return by reference in C++ with Examples - GeeksforGeeks
https://www.geeksforgeeks.org/return-by-reference-in-c-with-examples/
Returning values by reference in C++ - Tutorialspoint
https://www.tutorialspoint.com/cplusplus/returning_values_by_reference.htm
參考類型函式傳回 | Microsoft Docs
https://docs.microsoft.com/zh-tw/cpp/cpp/reference-type-function-returns?view=vs-2019
傳回值型態
https://openhome.cc/Gossip/CppGossip/returnBy.html
Is the practice of returning a C++ reference variable evil? - Stack Overflow
https://stackoverflow.com/questions/752658/is-the-practice-of-returning-a-c-reference-variable-evil
How to return a class object by reference in C++? - Stack Overflow
https://stackoverflow.com/questions/8914509/how-to-return-a-class-object-by-reference-in-c
reference - How to “return an object” in C++? - Stack Overflow
https://stackoverflow.com/questions/3350385/how-to-return-an-object-in-c

其它相關文章推薦
C/C++ 新手入門教學懶人包
C/C++ call by value傳值, call by pointer傳址, call by reference傳參考 的差別
C++ std::sort 排序用法與範例完整介紹
std::queue 用法與範例
std::thread 用法與範例
C++ virtual 的兩種用法
C/C++ 判斷檔案是否存在
C++ 設計模式 - 單例模式 Singleton Pattern