入门:c++系列问(五)关于析构函数的调用??
#include <iostream>
using namespace std;
class A {
int i;
public:
A(int ii): i(ii) {cout<<"A constructor"<<endl;}
~A() {cout<<"~~~~A "<<endl;}
void f() const {cout<<"a:f"<<endl;}
};
class B {
int i;
public:
B(int ii):i(ii) {cout<<"b constructor"<<endl;}
~B() {cout<<"~~~~b "<<endl;}
void f() const {cout<<"b:f"<<endl;}
};
class C : public B,public A {
public:
C(int ii):A(ii),B(ii) {cout<<"c constructor"<<endl;}
~C() {cout<<"~~~~c "<<endl;} // Calls ~A() and ~B()
void f() const { // Redefinition
cout<<"~~~~fc "<<endl;
}
};
int f1(C c) { cout<<sizeof(c)<<endl; return 1;}
int f2(A c) {cout<<sizeof(c)<<endl; return 1;}
int f3(B c) {cout<<sizeof(c)<<endl; return 1;}
int main() {
C c(78);
f1(c); 输出为 :8。~~c ~~b ~~a
f2(c); 4 ~~a ~~a
f3(c); 4 ~~~b ~~b
我的问题是在f2和f3函数中为什么能有两次析构函数的调用?
我的理解:因为是值传递,而且发生了对象的切片,编译器应该调用默认的拷贝构造函数,完成按比特的拷贝,这样就调用了一次构造函数,离开函数时这个对象析构,此时调用析构函数,但是为什么会有两次调用呢????