这个是今天踩到的坑,记录一下。
首先先给出几个概念:
1)类对象在创建时会调用构造函数,在释放是会调用析构函数;
2)函数中的局部变量在函数返回后,会由于弹栈从而内存被释放;
3)如果函数参数是采用值传递的方式传入类对象,则由于值传递的性质,先调用类复制构造函数产生一个临时对象,然后在函数返回后会调用类析构函数将该临时对象内存释放;
直接贴测试代码吧:
class A { public: A() { cout<<"class create"<<endl; } A(const A &a) { cout<<"class copy"<<endl; } ~A() { cout<<"class delete"<<endl; } }; void func(A test) { } int main(void) { A a; func(a); }
结果输出:
很明显,一次copy是由于值传递调用复制构造函数导致,一次delete是由于func函数返回导致。
所以在对类对象进行参数传递的过程中,采用引用传递是一个正确的方式。
void func(A &test) { }
其实这个坑也说明了一个问题,复制构造函数为什么是采用引用传递的形式,而不是采用值传递。假如采用值传递的方式,会导致什么样的后果?(会无限递归调用复制构造函数,当然
实际过程中代码是不会通过编译的)