当对象作为参数传递给另一个类的构造函数时,我只是不明白为什么要调用析构函数。 这是问题出现的代码部分:
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();
}
答案 0 :(得分:8)
构造函数按值获取其参数。在构造函数返回时创建,使用然后销毁副本。
通过引用获取参数(const引用最好)。
答案 1 :(得分:1)
RunLengthEncoding(*sea);
这需要一个值。不是指向值的指针,也不是对值的引用。编译器插入代码以创建值并将其传递给函数。在函数内部,如果你修改了它,它就不会改变你想象的传入的值。调用函数后,值就会被破坏。
*sea
未传递给该函数。它无法在函数内修改。
答案 2 :(得分:0)
由于构造函数在函数结束后按值获取其参数,因此对象超出范围并因此被销毁。由于您无法更改构造函数的参数,因此对象将始终被销毁,因此唯一的方法是创建堆上分配的对象的新副本(因此不会被销毁)但是这不是很好编码实践