我有以下代碼中的函數調用動態分配一個類對象:爲什麼分配給非基準的基準會改變其動態行爲
#include <iostream>
class A
{
public:
A(){std::cout<<"Constructing..."<<std::endl;}
~A(){std::cout<<"Deconstructing..."<<std::endl;}
};
A & f()
{
std::cout<<"Calling f()"<<std::endl;
A * pa = new A();
std::cout<<"End calling f()"<<std::endl;
return *pa;
}
int main()
{
A & b = f();
}
輸出是:
Calling f()
Constructing...
End calling f()
這意味着類對象從不刪除。
但是,如果我在main
行更改爲:
A b = f();
的輸出是:
Calling f()
Constructing...
End calling f()
Deconstructing...
這意味着類對象被自動刪除。
爲什麼分配對非引用的引用會改變其動態行爲?
只有'b'在第二個被破壞,而不是'* pa'。 C++具有價值語義。引用是例外。 – chris
@chris如果在第二種情況下從'* pa'複製了'b',爲什麼沒有在這裏調用的構造函數? –
@HaliangZhang:因爲它被複制(或移動),使用複製(或移動)構造函數。你只從默認的構造函數中打印,這裏沒有使用它。 –