我试图想出一个具体的推理,为什么要在引用上使用指针 作为函数的返回类型,
我的理由是,如果无意中将null值返回给引用类型 它无法检查,并可能导致运行时错误
int& something(int j)
{
int* p = 0 ;
return *p;
}
void main()
{
int& i = something(5);
i = 7; // run-time error
}
如果我使用了指针,我可以检查它并避免错误 指针返回值将作为必须返回值的契约。
void main()
{
int* i = something(5);
if( i != null )
*i = 7;
}
任何想法都将不胜感激 再次,
你会用什么?为什么? 引用或指针 提前谢谢。答案 0 :(得分:20)
如果符合以下条件,您可以使用指针代替引用:
无论如何,您不希望返回指针或对局部变量的引用。
答案 1 :(得分:8)
参考是一种不同的思维方式。将引用视为“指向现有对象的指针”。一旦你这样做,你就会明白为什么它们不能为NULL - 对象存在并且引用指向它。
因此,如果您的函数返回对它创建的内容的引用,则需要保证它实际上确实创建了一个有效的对象。如果它没有,或者不能,那么这就是抛出异常的理由。
用指针对比。指针可以为NULL,调用者必须处理NULL返回值。因此,如果您的函数无法保证它将返回有效的引用并且您不想抛出异常,则需要使用指针。
答案 2 :(得分:2)
如果你无意中返回一个空值,那就是一个bug。您可以轻松地将检查放在something()
内,如果它为空则抛出异常。
话虽如此,历史惯例是通过指针返回堆对象,即使它们被保证为非null。
答案 3 :(得分:1)
C ++引用不能为null。该错误是取消引用空指针。这是未定义的行为。
答案 4 :(得分:1)
如果您的函数旨在“始终”返回一个值,那么您的函数应该返回一个引用。
在某些情况下,由于某些特殊原因,您无法找到要返回的值,您应该抛出异常。
当您尝试返回对null或wild指针的引用时,不应该依赖于生成的运行时错误。行为未定义。任何事情都可能发生。
答案 5 :(得分:0)
它通常取决于您要完成的任务,但我通常会以这种方式处理返回值:
返回指针 - 来电者拥有内存(和清理)
参考 - Callee拥有内存。除非被调用者也管理它,否则不要返回动态分配的点。