我想就我在學習 C 時遇到的這個問題尋求幫助。我試圖將物件直接存盤到陣列中,但意識到物件會立即被解構。我不明白為什么會這樣。
#include <iostream>
class Thing{
public:
~Thing(){
std::cout<<"Thing destructing";
}
};
int main(){
Thing arr[1];
arr[0] = Thing();
int x;
std::cin>>x;
};
uj5u.com熱心網友回復:
在這份宣告中
arr[0] = Thing();
使用了默認的復制賦值運算子,該運算子將由此運算式創建的臨時物件分配給Thing()陣列元素。賦值后臨時物件被銷毀。
為了更清楚地運行這個演示程式。
#include <iostream>
class Thing
{
public:
~Thing()
{
std::cout<<"Thing " << i << " destructing\n";
}
Thing & operator =( const Thing & )
{
std::cout << "Thing " << i << " assigning\n";
return *this;
}
Thing() : i( n )
{
std::cout << "Thing " << i << " constructing\n";
}
private:
size_t i;
static size_t n;
};
size_t Thing::n = 0;
int main()
{
{
Thing arr[1];
arr[0] = Thing();
}
std::cin.get();
return 0;
}
它的輸出是
Thing 1 constructing
Thing 2 constructing
Thing 1 assigning
Thing 2 destructing
Thing 1 destructing
uj5u.com熱心網友回復:
假設你還不知道。
智能指標
#include <memory>
// ...
int main() {
std::shared_ptr<Thing> arr[1];
arr[0] = std::shared_ptr<Thing>(new Thing());
// ...
// <-- Is automatically deleted around here.
}
指標
不建議; 使用指標看起來像:
int main() {
Thing *arr[1] = {};
arr[0] = new Thing();
int x;
std::cin >> x;
// WARNING: remember to manually delete.
delete arr[0];
} // <-- BTW, you don't need semi-colon.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/353663.html
