2011-08-22 43 views
8

Tôi đã đọc về các con trỏ hàm và sử dụng chúng làm tham số cho các hàm khác. Câu hỏi của tôi là làm thế nào bạn sẽ vượt qua một chức năng bằng cách tham khảo mà không cần sử dụng con trỏ? Tôi đã cố gắng tìm câu trả lời trên Internet nhưng tôi không tìm được câu trả lời hay. Tôi biết rằng bạn có thể chuyển các biến theo tham chiếu như sau: void funct(int& anInt);. Làm thế nào bạn sẽ làm một cái gì đó tương tự như thế này, nhưng thay vì một tham chiếu đến một biến một tham chiếu đến một chức năng là tham số? Ngoài ra, bạn sẽ sử dụng tham chiếu đến hàm trong một hàm chức năng như thế nào?C++: Làm thế nào để chuyển tham chiếu đến hàm thành một hàm khác?

+0

Lưu ý:. Bạn không thể vượt qua chức năng này. Bạn chỉ có thể chuyển các tham chiếu hoặc con trỏ tới các hàm. –

Trả lời

22
#include <iostream> 
using namespace std; 

void doCall(void (&f)(int)) 
{ 
    f(42); 
} 

void foo(int x) 
{ 
    cout << "The answer might be " << x << "." << endl; 
} 

int main() 
{ 
    doCall(foo); 
} 

Cheers & hth,

+1

Chỉ vì tò mò, tại sao tôi muốn sử dụng một tham chiếu đến một hàm thay vì một con trỏ trỏ đến một hàm? – fredoverflow

+10

@FredOverflow: Bởi vì một con trỏ có thể là null hoặc không hợp lệ. Một tham chiếu đảm bảo rằng nó hợp lệ và không null (không có tham chiếu null), hoặc nếu không có lỗi trong chương trình. –

+4

@Alf P. Steinbach: "Nếu không có lỗi trong chương trình" Nghe có vẻ tuyệt vời về mặt lý thuyết nhưng nếu bạn có một cái gì đó như 'sometype & ref = * ptr;' địa chỉ trong con trỏ sẽ được sao chép vào địa chỉ trong tham chiếu, có thể không hợp lệ hoặc không hợp lệ. Bạn có thể nói rằng câu lệnh trên là hành vi không xác định khi 'ptr' không hợp lệ hoặc không có giá trị, nhưng sẽ không có bất kỳ dấu hiệu nào về thời gian biên dịch hoặc thời gian chạy, do đó, nó vẫn là lập trình viên để đảm bảo nó là hợp lệ và không null, giống như khi bạn sử dụng một con trỏ. Vì vậy, tôi nói không có bất kỳ sự khác biệt nào đối với lập trình viên. – newacct

Các vấn đề liên quan