簡體   English   中英

C ++引用復制和賦值

[英]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)

更新:

  1. 與Q1有關的問題是我正在做cout << &a ,當我應該做cout << a

  2. 為了消除返回值優化,我用-fno-elide-constructors編譯。 我正在使用g ++。

A1:您創建了一個新的*帶A* a = new A()a主比不同aA::add a in main由變量z引用

A2:不,你在堆上創建a ,所以它會持續到你在該變量上調用delete

A3:取消引用不會更改存儲在指針中的內存位置,它只會獲取存儲在該位置的值。 引用更像是別名。 所以&b就像說&(*a)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM