當你通過引用返回一個對象(即T& fun(...) { ...}
),那麼你是當你返回函數之前的值(即T fun(...) { ...}
)的對象被複制返回的對象返回您正在使用自己的函數中,而同一個對象。
您可以檢查這個,如果你打印的功能裏面,並已回到住處後,你的對象的內存地址:
printf("%p\n", &my_object);
的const
只是說編譯器應該確保你不會從修改對象外(即你不能這樣做:object.field = value
)。
我已經安排這樣,顯示所有那些approches之間的差異:
#include <stdio.h>
class X {
public:
int i;
X();
X(const X&);
};
// Copy constructor
X::X(const X& x) {
printf("Copy constructor invoked\n");
}
// Default constructor
X::X() : i(0) {
printf("Creating a object\n");
}
X my_fun_1(X& x) { return x; }
X& my_fun_2(X& x) { return x; }
const X& my_fun_3(X& x) { return x; }
int main() {
X x0;
printf("\nInvoke my_fun_1\n");
X x1 = my_fun_1(x0);
printf("\nInvoke my_fun_2\n");
X& x2 = my_fun_2(x0);
printf("\nInvoke my_fun_3\n");
const X& x3 = my_fun_3(x0);
printf("\nResults:\n");
printf("x0 => %p\n", &x0);
printf("x1 => %p\n", &x1);
printf("x2 => %p\n", &x2);
printf("x3 => %p\n", &x3);
x0.i = 1;
x1.i = 1;
x2.i = 1;
//Compile-time error: x3.i = 1;
return 0;
}
編譯並執行它時,輸出應爲:
$ g++ a.cpp && ./a.out
Creating a object
Invoke my_fun_1
Copy constructor invoked
Invoke my_fun_2
Invoke my_fun_3
Results:
x0 => 0x7fff8710cce0
x1 => 0x7fff8710ccf0
x2 => 0x7fff8710cce0
x3 => 0x7fff8710cce0
說明:
- 如果您不使用
&
則使用複製構造函數
- 如果使用
const
,則使用該引用修改返回的對象是編譯時錯誤。
稍後您可以在程序中爲'b'分配一個不同的值,但'c'和'd'都是const的引用,所以它們不能被修改。我不確定這是你問的問題,你的問題有點含糊。 –