C++物件到bool值的轉換
問題
最近在使用pugixml,在閱讀原始碼自帶的例程時(docs/samples/load_error_handling.cpp),發現有段程式碼比較迷惑,
這裡生成了一個xml_parse_result的物件result,用於接受doc.load_string()的返回值,緊接著就使用if語句去判斷這個result,迷惑就出在這裡:按照慣性思維,這個if的判斷條件肯定是真,因為這是個具體物件。但是程式碼這樣寫,肯定是有原因的,於是查閱原始碼看下xml_parse_result的實現,
// Parsing result
struct PUGIXML_CLASS xml_parse_result
{
// Parsing status (see xml_parse_status)
xml_parse_status status;
// Last parsed offset (in char_t units from start of input data)
ptrdiff_t offset;
// Source document encoding
xml_encoding encoding;
// Default constructor, initializes object to failed state
xml_parse_result();
// Cast to bool operator
operator bool() const;
// Get error description
const char* description() const;
};
發現倒數第二條語句的註釋:Cast to bool operator,意思是轉換為bool操作符。再看下這個函式的定義,返回的是個bool值,
PUGI__FN xml_parse_result::operator bool() const
{
return status == status_ok;
}
應該就是這裡起作用的,當處於if的條件判斷中時,物件會轉換為bool值。於是查閱了《C++ primer 5th》,發現14.9節 過載、型別轉換和運算子講到了這點,如下,
型別轉換運算子(conversion operator)是類的一種特殊成員函式,它負責將一個類型別的值轉換成其他型別。型別轉換函式的一般形式如下所示:
operator type() const;
其中type表示某種型別。型別轉換運算子可以面向任意型別(除了void之外)進行定義,只要該型別能作為函式的返回型別。因此,我們不允許轉換成陣列或者函式型別,但允許轉換成指標(包括陣列指標及函式指標)或者引用型別。
一個型別轉換函式必須是類的成員函式;它不能宣告返回型別,形參列表也必須為空。型別轉換函式通常應該是const。
由於之前看書看到操作符過載時只關注了加減乘除,函式呼叫符等,沒有在意這個,所以出現了迷惑,看來還需要加深學習。
舉個栗子
這裡再舉個簡單的例子來佐證這一點,
#include <iostream>
using namespace std;
class TestClass
{
public:
TestClass() : status(1) {}
virtual ~TestClass() {}
int status;
// 如果status等於1就返回true,否則返回false
operator bool() const { return status == 1; }
};
int main()
{
TestClass ss;
ss.status = 1;
if (ss) {
cout << "hello1" << endl;
} else {
cout << "hello2" << endl;
}
ss.status = 0;
if (ss) {
cout << "hello1" << endl;
} else {
cout << "hello2" << endl;
}
return 0;
}
輸出結果如下,
可以看出,當物件處於if的條件判斷語句中時,會自動轉變為bool值。在實際使用中還是比較方便的。
關於物件轉換為其它型別的更多細節,請閱讀《C++ Primer 5th》的14.9節。
如果有寫的不對的地方,希望能留言指正,謝謝閱讀。