返回类型不是指针时返回NULL

时间:2013-11-28 09:41:17

标签: c++

我有一个定义为

的函数
ClassType f(int i) {
  if (...) return NULL;
  ...
  ClassType obj;
  return obj;
}

我很好奇为什么当类类型需要作为返回类型时,合法地接受“NULL”?我认为NULL通常由Macro定义为'0'的同义词。有人可以解释这背后的理由吗?谢谢!

更新

该类定义为:

class ClassType {
public:
  ClassType() {};
  ClassType(char* s) {...};
...
}

还有一个问题,c ++在按值返回时是否进行隐式转换?

谢谢!

4 个答案:

答案 0 :(得分:3)

class ClassType {
public:
  ClassType() {};
  ClassType(char* s) {...}; // <<-----
}

当您说return NULL;时,会使用我标记的构造函数。该值可隐式转换为char*NULL通常定义为0,这是一个有效的指针值。

  

还有一个问题,c ++在返回值时是否进行隐式转换?

是的,因为它必须构造一个合适类型的对象。

答案 1 :(得分:1)

首先,在这种情况下,可以返回NULL,因为编译器将使用ClassType(char* s)构造函数作为构造函数参数传递NULL

但一般来说,对于像这样的情况,您可能希望将对象作为参数传递给函数,然后返回布尔truefalse函数是否成功。

答案 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