簡體   English   中英

當返回類型不是指針時返回NULL

[英]Returning a NULL when return type is not a pointer

我有一個定義為

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

我很好奇,當將類類型要求為返回類型時,為什么可以合法接受“ NULL”? 我認為NULL通常由Macro定義為“ 0”的同義詞。 有人可以解釋其背后的原因嗎? 謝謝!

更新:

該類定義為:

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

還有一個問題,按值返回時,c ++會進行隱式轉換嗎?

謝謝!

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

當您說return NULL;時,將使用我標記的構造函數return NULL; 該值可以隱式轉換為char* (通常將NULL定義為0 ,這是一個有效的指針值)。

還有一個問題,C ++在返回值時是否進行隱式轉換?

是的,因為它必須構造適當類型的對象。

首先,在這種情況下,您可以返回NULL ,因為編譯器隨后將使用ClassType(char* s)構造函數,並將NULL作為構造函數參數傳遞。

但是通常,對於此類情況,您可能希望將對象作為函數的引用參數傳遞,然后在函數成功與否時返回布爾值truefalse

Null是定義為0的宏,它是一個整數值。 如果ClassType具有接受整數或指針的構造函數,則編譯器將自動將整數0轉換為ClassType

class ClassType 
{
public:
    ClassType(const int);
};

如果該類沒有可為0的構造函數,則編譯器將引發錯誤。

不能准確地回答您的問題,但通常要指出可選的返回值,請考慮以下內容。


對於可選的返回值有意義的情況,您可以考慮boost::optional ,並且C ++ 14可能會定義std::optional (基於boost-library)。

在diguise附加返回值,比如bool以及指示成功,經常會在你不僅可以在情況下,你可以 初始化對象的負擔,如果你想返回一個可選的值,對於這個沒有默認的建設,你要么可以” t,否則您必須傳遞參考指針,然后必須在被調用的站點處檢查指針,等等:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM