#include<iostream>
using namespace std;
class A{
public:
static int cnt;
A()
{
++cnt;
cout<<"constructor:"<<cnt<<endl;
}
~A()
{
--cnt;
cout<<"destructor:"<<cnt<<endl;
}
};
int A::cnt = 0;
A f(A x){
return x;
}
int main(){
A a0;
A a1 = f(a0);
return 0;
}
chương trình sẽ đầu ra:Tại sao destructor của tôi xuất hiện để được gọi thường xuyên hơn so với các nhà xây dựng?
constructor:1 destructor:0 destructor:-1 destructor:-2
Các constructor và destructor không xuất hiện theo cặp?
Chào mừng bạn đến với Stack Overflow! 1 và cảm ơn bạn đã cung cấp một chương trình mẫu hoàn chỉnh. Xem http://SSCCE.ORG vì lý do quan trọng. –
Sao chép contructor được gọi bởi 'return x;' rõ ràng đã được tối ưu hóa, nhưng tôi tự hỏi liệu một trình tối ưu hóa đủ mạnh có thể loại bỏ lời gọi khi gọi 'f' (' x' được truyền theo giá trị) hay không. Vì vậy, có hiệu quả bạn gọi destructor mặc định một lần và sau đó các nhà xây dựng bản sao một lần. –
@FrerichRaabe: tối ưu hóa đó sẽ không phù hợp với tiêu chuẩn, cho phép người tạo bản sao bỏ qua chỉ trong một số trường hợp nhất định. Trong tất cả các trường hợp được phép, nguồn hoặc đích của bản sao ưu tiên là tạm thời. –