之前我对这个问题有不同的答案,所以决定再问这里。
假设我有一个函数node* foo()
,如果某些函数失败,我会return NULL
。这段代码真的返回NULL
指针吗?或者这是NULL
一个local temporary object
?编译时我没有警告。我还可以写这样的东西:
node* ptr = foo();
if (ptr)
printf("Not NULL");
else
printf("NULL");
看起来很有效。 (但是如果这个函数是,例如const string& foo()
则没有)
答案 0 :(得分:11)
NULL
是一个指针文字,定义为包含一个特殊值。
一个可能的定义是:
#define NULL ((void *)0)
有关详情,请参阅this faq
关于const string& foo()
,我相信你的意思是C ++的std::string
。
std::string有no implicit constructor用NULL指针初始化它。
因此,您应该使用一些异常或空字符串来向调用者指示错误。 (如果你没有投掷,你必须返回std::string
。即使返回的对象是本地的,当它保持在local constant reference时它的生命也会延长。但返回其他类型并期望隐式转换是不是个好主意。)
回答你的问题:因为NULL是文字,所以大部分时间都不会创建临时对象,实际值可以直接返回给调用者。
答案 1 :(得分:3)
此功能
const string& foo();
不返回指针。它返回对std :: string类型的对象的常量引用。因此,它的返回值可能不会分配给指针。
根据C ++标准
4.10指针转换[conv.ptr]
1空指针常量是值为零的整数文字(2.14.2)或类型为std :: nullptr_t的prvalue。空指针常量可以转换为指针类型;结果是该类型的空指针值,并且可以与对象指针或函数指针类型的每个其他值区分开。这种转换称为空指针转换。相同类型的两个空指针值应相等。将空指针常量转换为指向cv限定类型的指针是单个转换,而不是指针转换的序列,后跟限定转换(4.4)。可以将整数类型的空指针常量转换为std :: nullptr_t类型的prvalue。 [注意:生成的prvalue不是空指针值。 - 后注]
因此,当您使用用NULL定义的空指针常量时,它将被分配给函数的返回指针,该指针将包含类型为node *
的空指针值
答案 2 :(得分:2)
通常NULL
字面意思是指针指向什么都没有 - 通常没有任何值由0
表示。无论是什么,C
或C++
。
答案 3 :(得分:1)
当您返回NULL或其他任何内容时,返回值可能保存在堆栈(或CPU寄存器)中。所以你得到一个临时的#34;匿名"变量那里,它只存在于你调用函数的行上。
这是在"线之间完成的。由编译器以某种实现定义的方式。不要将此与函数内局部变量的范围混淆。
当然,编译器可能会通过对代码进行某种形式的内联函数优化来决定优化整个参数/返回值的重排。
至于返回引用,将引用设置为NULL没有任何意义。引用应指向一些已分配的内存。如果你有一个函数返回一个引用,它很可能指向一个传递的参数。返回NULL是一种简单的C语言错误处理方式。在C ++中,您有更多选项,例如抛出异常。