1. 程式人生 > >C++物件到bool值的轉換

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節。

如果有寫的不對的地方,希望能留言指正,謝謝閱讀。