2013-08-13 75 views
7

Tôi googled, nhưng không tìm thấy một câu trả lời rõ ràng. Ví dụ:Toán tử void *() có nghĩa là gì?

class Foo { 
public: 
    operator void*() { 
     return ptr; 
    } 

private: 
    void *ptr; 
}; 

Tôi hiểu những gì void* operator() là. Là điều hành trên cùng một điều trong một cú pháp khác nhau? Nếu không, nó là gì? Và làm cách nào tôi có thể sử dụng toán tử đó để lấy số ptr?

+0

Lưu ý rằng mã hiện tại của bạn có một lỗi đánh máy, thiếu 'opeator' s an r – StephenTG

+0

@StephenTG Cảm ơn. Đã sửa đổi – GuLearn

+1

Đó là toán tử truyền. http://ideone.com/k1EiJF – Chad

Trả lời

15

Không có hai nhà khai thác khác nhau. Hàm operator void* là hàm đúc kiểu, trong khi operator() là toán tử gọi hàm.

Mục đầu tiên được sử dụng khi bạn muốn chuyển đổi một phiên bản Foo thành void*, như ví dụ:

Foo foo; 
void* ptr = foo; // The compiler will call `operator void*` here 

Thứ hai được sử dụng như một chức năng:

Foo foo; 
void* ptr = foo(); // The compiler calls `operator()` here 
+0

Vì vậy, 'toán tử()' có thể được triển khai để cung cấp các đối tượng có thể gọi được? – JAB

+0

@JAB Đúng vậy. –

+0

Điều đó có cho phép chuyển đổi ngầm không? ví dụ. Tôi có thể chuyển Foo một cách an toàn đến một hàm như 'void bar ([anytype])' nếu tôi thực hiện 'toán tử [anytype]()' trong Foo? – GuLearn

0

Đó là toán tử chuyển đổi loại. Nó được sử dụng bất cứ khi nào một đối tượng của lớp Foo được đúc (chuyển đổi) thành void*. Nó thực sự không giống như void* operator().

5

Đó là chức năng xác định những gì sẽ xảy ra khi đối tượng được chuyển đổi sang một con trỏ void, ở đây nó đánh giá đến địa chỉ các thành viên ptr điểm đến.

Đôi khi rất hữu ích để xác định hàm chuyển đổi này, ví dụ: để đánh giá boolean của đối tượng.

Dưới đây là một ví dụ:

#include <iostream> 

struct Foo { 
    Foo() : ptr(0) { 
     std::cout << "I'm this: " << this << "\n"; 
    } 
    operator void*() { 
     std::cout << "Here, I look like this: " << ptr << "\n"; 
     return ptr; 
    } 
private: 
    void *ptr; 
}; 

int main() { 
    Foo foo; 
    // convert to void* 
    (void*)foo; 
    // as in: 
    if (foo) { // boolean evaluation using the void* conversion 
     std::cout << "test succeeded\n"; 
    } 
    else { 
     std::cout << "test failed\n"; 
    } 
} 

Đầu ra là:

$ g++ test.cc && ./a.out 
I'm this: 0x7fff6072a540 
Here, I look like this: 0 
Here, I look like this: 0 
test failed 

Xem thêm:

+0

"nếu không nó sẽ là địa chỉ của đối tượng chính nó, điều này." - Không, không. Tôi nghĩ rằng bạn đang bối rối đối tượng với một con trỏ đến đối tượng. – hvd

+0

@ hvd bạn đúng, sửa lỗi đó. – moooeeeep