2011-01-05 53 views

Trả lời

98

hàm thành viên của các hình thức

operator TypeName() 

là nhà khai thác chuyển đổi. Chúng cho phép các đối tượng thuộc loại lớp được sử dụng như thể chúng thuộc loại TypeName và khi chúng là, chúng được chuyển đổi thành TypeName bằng cách sử dụng hàm chuyển đổi.

Trong trường hợp cụ thể này, operator bool() cho phép đối tượng thuộc loại lớp được sử dụng như thể là bool. Ví dụ, nếu bạn có một đối tượng của kiểu lớp tên obj, bạn có thể sử dụng nó như

if (obj) 

này sẽ gọi operator bool(), trả kết quả, và sử dụng kết quả như tình trạng của if.

Cần lưu ý rằng operator bool() là một ý tưởng rất tồi và bạn thực sự không bao giờ nên sử dụng nó. Để có giải thích chi tiết về lý do tại sao nó xấu và giải pháp cho vấn đề, hãy xem "The Safe Bool Idiom."

(C++ 0x, sửa đổi sắp tới của C++ Standard, thêm hỗ trợ cho các toán tử chuyển đổi rõ ràng. viết explicit operator bool() an toàn hoạt động chính xác mà không cần phải nhảy qua các vòng thực hiện Safe Bool Idiom.)

+2

+1 để tham chiếu đến Safe Bool Idiom – greyfade

+1

"được sử dụng như thể nó là một bool" sai ngụ ý bạn có thể, nói, gán cho nó một giá trị boolean. Thay vào đó, trong mã của poster, nó tạo ra một biến tạm thời của kiểu bool có liên quan đến giá trị tạm thời của col nhưng sau đó độc lập với đối tượng đã tạo ra nó. Hơn nữa, đề cập đến Safe Bool Idiom là tuyệt vời, nhưng chỉ để đăng ký mà xem trái tồn tại: IMHO "không bao giờ thực sự sử dụng nó" lời khuyên là trên đầu trang - nó cung cấp cho kiểm tra trình biên dịch chặt chẽ hơn chống lại lạm dụng ngớ ngẩn với chi phí của một API obfuscated hơn có thể dẫn đến lạm dụng tình cờ. –

+1

@Tony: Vâng, nó có thể được sử dụng như thể nó là một bool; vì kết quả của việc chuyển đổi là một giá trị ('bool'), không, bạn không thể gán cho nó. Nếu đó là một lvalue có thể sửa đổi (ví dụ: 'bool &') thì bạn có thể gán cho nó. Về tính chính xác, tôi cho rằng một toán tử 'bool()' luôn luôn không chính xác vì nó cho phép sử dụng một đối tượng kiểu lớp trong một số lượng lớn các tình huống mà bạn không bao giờ muốn nó được sử dụng. Bool an toàn là một lựa chọn vượt trội hơn rất nhiều. –

1

Đó là chuyển đổi ẩn thành bool. I E. bất cứ khi nào chuyển đổi ngầm được cho phép, lớp của bạn có thể được chuyển đổi thành bool bằng cách gọi phương thức đó.

3

Chức năng chuyển đổi của người dùng được định nghĩa implicit để chuyển đổi lớp học của bạn thành true hoặc false.

//usage 
bool value = yourclassinstance; //yourclassinstance is converted into bool! 
0

Như những người khác đã nói, đó là loại chuyển đổi, trong trường hợp này là bool. Ví dụ:

class A { 
    bool isItSafe; 

public: 
    operator bool() const 
    { 
     return isItSafe; 
    } 

    ... 
}; 

Bây giờ tôi có thể sử dụng một đối tượng của lớp này như thể nó là một boolean:

A a; 
... 
if (a) { 
    .... 
} 
8
operator bool() const 
{ 
    return col != 0; 
} 

Định nghĩa như thế nào lớp là gì chuyển thành một giá trị boolean, các const sau () được sử dụng để chỉ ra phương pháp này không biến đổi (thay đổi các thành viên của lớp này).

Bạn thường sử dụng các nhà khai thác như sau:

airplaysdk sdkInstance; 
if (sdkInstance) { 
    std::cout << "Instance is active" << std::endl; 
} else { 
    std::cout << "Instance is in-active error!" << std::endl; 
} 
-1

Một sử dụng phổ biến là cho container std để làm so sánh bình đẳng về giá trị chủ chốt bên trong tùy chỉnh các đối tượng

class Foo 
{ 
    public: int val; 
}; 

class Comparer { public: 
bool operator() (Foo& a, Foo&b) const { 
return a.val == b.val; 
}; 

class Blah 
{ 
std::set< Foo, Comparer > _mySet; 
}; 
+0

Đây là ví dụ sử dụng toán tử '()' không 'toán tử bool'. Chúng hoàn toàn khác nhau. 'operator()' là toán tử cuộc gọi, do đó một 'Comparer' có thể được gọi là hàm. Toán tử ''() 'đó chỉ xảy ra để trả về' bool', nhưng điều đó không làm cho nó giống như 'toán tử bool', mà đơn giản chỉ cho phép một phép ẩn ngầm định vào' bool'. – anthropomorphic

4

tôi muốn cung cấp cho nhiều mã hơn để làm rõ.

struct A 
{ 
    operator bool() const { return true; } 
}; 

struct B 
{ 
    explicit operator bool() const { return true; } 
}; 

int main() 
{ 
    A a1; 
    if (a1) cout << "true" << endl; // OK: A::operator bool() 
    bool na1 = a1; // OK: copy-initialization selects A::operator bool() 
    bool na2 = static_cast<bool>(a1); // OK: static_cast performs direct-initialization 

    B b1;  
    if (b1) cout << "true" << endl; // OK: B::operator bool() 
    // bool nb1 = b1; // error: copy-initialization does not consider B::operator bool() 
    bool nb2 = static_cast<bool>(b1); // OK: static_cast performs direct-initialization 
} 
Các vấn đề liên quan