辨别几个方法传参的正确与否

来源:百度知道 编辑:UC知道 时间:2024/06/11 16:20:04
Item Add1(Item left, Item right)
{
Item result;
result.coef = left.coef + right.coef;
result.exp = left.exp + right.exp;
return result;
}

Item* Add2(Item left, Item right)
{
Item result;
result.coef = left.coef + right.coef;
result.exp = left.exp + right.exp;
return &result;
}

Item* Add3(Item left, Item right)
{
Item* pResult = new Item();
pResult->coef = left.coef + right.coef;
pResult->exp = left.exp + right.exp;
return pResult;
}

bool Add4(Item left, Item right, Item result)
{
result.coef = left.coef + right.coef;
result.exp = left.exp + right.exp;

return true;
}

bool Add5(Item left, Item right, Item* pResult)
{
pResult->coef = left.coef + right.coef;
pResult->exp = left.exp + right.exp;

return true;
} xxxxxxx

bool Add6(Item left, Item right, Item*

见注释:

// 返回 值类型
Item Add1(Item left, Item right)
{
Item result;
result.coef = left.coef + right.coef;
result.exp = left.exp + right.exp;
return result; // 传值形式返回,返回语句将函数堆栈上的局部变量拷贝一份传出去【正确】
}

// 返回指针类型
Item* Add2(Item left, Item right)
{
Item result;
result.coef = left.coef + right.coef;
result.exp = left.exp + right.exp;
return &result; // 返回指针,把函数堆栈上的局部变量的地址返回,由于函数返回后,堆栈被回收,则返回的指针指向已经被回收的地址上,如果后续操作为只读,则会使乱码,若写入,则会导致内存非法操作。【错误】
}

// 返回指针
Item* Add3(Item left, Item right)
{
Item* pResult = new Item(); // 在堆上分配内存
pResult->coef = left.coef + right.coef;
pResult->exp = left.exp + right.exp;
return pResult; // 返回进程堆空间上的地址。【正确】但需要在函数外部释放该指针所指内存,否则造成内存泄漏。
}

// 采用传值参数方式返回
bool Add4(Item left, Item right, Item result)
{// 由于是传值形式,即实参会被拷贝一份到函数堆栈上的临时变量上
那么在函数内部操作的是实参的拷贝,所以函数返回后实参内容没有改变【错误】
resu