这个是今天踩到的坑,记录一下。
首先先给出几个概念:
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) {}
python函数可以没有参数。其实这个坑也说明了一个问题,复制构造函数为什么是采用引用传递的形式,而不是采用值传递。假如采用值传递的方式,会导致什么样的后果?(会无限递归调用复制构造函数,当然
实际过程中代码是不会通过编译的)