类对象作为函数参数进行值传递

这个是今天踩到的坑,记录一下。

首先先给出几个概念:

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)
{
    
}

 

其实这个坑也说明了一个问题,复制构造函数为什么是采用引用传递的形式,而不是采用值传递。假如采用值传递的方式,会导致什么样的后果?(会无限递归调用复制构造函数,当然

实际过程中代码是不会通过编译的)

posted on 2018-03-17 21:49  chenjx_ucs  阅读(974)  评论(0编辑  收藏  举报

导航