[英]Why is returning None when of return type option<T> not return the null pointer when T is not a reference
[英]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
作為構造函數參數傳遞。
但是通常,對於此類情況,您可能希望將對象作為函數的引用參數傳遞,然后在函數成功與否時返回布爾值true
或false
。
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.