c ++中的析构函数行为

时间:2013-06-14 20:41:27

标签: c++

当对象作为参数传递给另一个类的构造函数时,我只是不明白为什么要调用析构函数。 这是问题出现的代码部分:

Ocean* sea=new Ocean(4,3,7);
sea->print();
RunLengthEncoding* s2= new RunLengthEncoding(*sea);
sea->print();

构造函数的代码:

RunLengthEncoding::RunLengthEncoding(Ocean sea)
{
oceanEncoding = new MyLinkedListD();
height = sea.height();
width=sea.width();
starveT=sea.starveTime();
int length=1;
int cellType=sea.cellContents(0,0);
int hunger=sea.sharkFeeding(0,0);
for(int row=0;row<height;row++){
    for(int col=0;col<width;col++){
        if(row==0&&col==0){
            cellType=sea.cellContents(col,row);
            hunger=sea.sharkFeeding(col,row);
        }
        else{
            if(sea.cellContents(col,row)==cellType && ((cellType==Ocean::SHARK && hunger==sea.sharkFeeding(col,row))|| cellType!=Ocean::SHARK)){
                    length++;
            }
            else{
                oceanEncoding->add(cellType,length,hunger);
                cellType=sea.cellContents(col,row);
                length=1;
                hunger=sea.sharkFeeding(col,row);
            }
        }
    }
}
oceanEncoding->add(cellType,length,hunger);
internalPointer=oceanEncoding->getHead();
check();

}

3 个答案:

答案 0 :(得分:8)

构造函数按值获取其参数。在构造函数返回时创建,使用然后销毁副本。

通过引用获取参数(const引用最好)。

答案 1 :(得分:1)

RunLengthEncoding(*sea);

这需要一个值。不是指向值的指针,也不是对值的引用。编译器插入代码以创建值并将其传递给函数。在函数内部,如果你修改了它,它就不会改变你想象的传入的值。调用函数后,值就会被破坏。

*sea未传递给该函数。它无法在函数内修改。

答案 2 :(得分:0)

由于构造函数在函数结束后按值获取其参数,因此对象超出范围并因此被销毁。由于您无法更改构造函数的参数,因此对象将始终被销毁,因此唯一的方法是创建堆上分配的对象的新副本(因此不会被销毁)但是这不是很好编码实践