我有一个定义为
的函数ClassType f(int i) {
if (...) return NULL;
...
ClassType obj;
return obj;
}
我很好奇为什么当类类型需要作为返回类型时,合法地接受“NULL”?我认为NULL通常由Macro定义为'0'的同义词。有人可以解释这背后的理由吗?谢谢!
更新
该类定义为:
class ClassType {
public:
ClassType() {};
ClassType(char* s) {...};
...
}
还有一个问题,c ++在按值返回时是否进行隐式转换?
谢谢!
答案 0 :(得分:3)
class ClassType {
public:
ClassType() {};
ClassType(char* s) {...}; // <<-----
}
当您说return NULL;
时,会使用我标记的构造函数。该值可隐式转换为char*
(NULL
通常定义为0
,这是一个有效的指针值。
还有一个问题,c ++在返回值时是否进行隐式转换?
是的,因为它必须构造一个合适类型的对象。
答案 1 :(得分:1)
首先,在这种情况下,可以返回NULL
,因为编译器将使用ClassType(char* s)
构造函数作为构造函数参数传递NULL
但一般来说,对于像这样的情况,您可能希望将对象作为参数传递给函数,然后返回布尔true
或false
函数是否成功。
答案 2 :(得分:1)
Null是一个用0
定义的宏,它是一个整数值。如果ClassType
有一个接受整数或指针的构造函数,那么编译器会自动将整数0转换为ClassType
:
class ClassType
{
public:
ClassType(const int);
};
如果类没有可以取0的构造函数,那么编译器将抛出错误。
答案 3 :(得分:0)
不准确回答您的问题,但一般来说,要指出可选的返回值,请考虑以下内容。
对于可选返回值有意义的情况,您可以查看boost::optional
,C ++ 14可能会定义std::optional
(基于boost-library)。
diguise中的其他返回值,如bool
表示成功,通常会造成您无法初始化对象的负担,只有在可以的情况下,如果你想返回一个没有默认构造的可选值,你要么不能,要么你必须传递引用指针,然后必须检查被叫站点上的指针,等等:
std::optional<Intensity> sample_spectrum (float); // clean and concise
-------------------------------------------------------------------------
bool sample_spectrum (Intensity &out); // either not possible or you
// have a wasted initialization
-------------------------------------------------------------------------
bool sample_spectrum (Intensity *& out) { // now you have two problems
if (!out) throw std::logic_error(""); // I
....
}
....
try { .... } catch (...) { .... } // II
-------------------------------------------------------------------------
Intensity *sample_spectrum(float) ; // please no
-------------------------------------------------------------------------
std::shared_ptr<Intensity>
sample_spectrum(float); // just use std/boost::optional