[英]C++ reference copying and assignment
關於下面的代碼我幾乎沒有問題
#include <iostream>
using namespace std;
class A
{
public:
A & add(A & b);
};
A & A::add(A & z)
{
A * a = new A();
A & b = *a;
cout << "Inside add, address of a: " << &a << endl;
cout << "Inside add, address of b: " << &b << endl;
cout << "Inside add, address of z: " << &z << endl;
A aa;
cout << "Inside, add, address of aa: " << &aa << endl;
return aa;
}
int main()
{
A *a = new A();
cout << "Original a: " << a << endl;
A & b = a->add(*a);
cout << "b: " << &b << endl;
return 0;
}
Q1。 在main,第3行, a->add(*a)
,傳遞指針* a指向的同一對象。 但是在函數A::add(A &)
,當我嘗試通過A &b = *a
實現相同的效果時,我得到一個不同的對象。 為什么會這樣?
Q2。 在A::add(A &)
,我返回一個非const引用到本地對象aa
和main獲取與本地引用相同的內存地址。 因此,這可以延長本地參考的壽命,超出其范圍。
Q3。 在A::add(A &)
,我多次取消引用*a
,首先通過A &b = *a
然后return *a
。 在這兩種情況下,內存地址始終相同。 這是怎么回事? 您可以檢查A::add(A &)
中&b
的輸出和A &b = a->add(*a)
更新:
與Q1有關的問題是我正在做cout << &a
,當我應該做cout << a
為了消除返回值優化,我用-fno-elide-constructors編譯。 我正在使用g ++。
A1:您創建了一個新的*帶A* a = new A()
的a
主比不同a
的A::add
。 a
in main由變量z
引用
A2:不,你在堆上創建a
,所以它會持續到你在該變量上調用delete
A3:取消引用不會更改存儲在指針中的內存位置,它只會獲取存儲在該位置的值。 引用更像是別名。 所以&b
就像說&(*a)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.