2013-03-03 37 views
5

Nói rằng tôi xác định, nhanh chóng, và sử dụng một functor bộ cộng như vậy:Trình biên dịch xử lý các toán tử gọi hàm bị quá tải trong các hàm functors như thế nào?

class SomeAdder { 
    public: 
     SomeAdder(int init_x): x(init_x) {} 
     void operator()(int num) { cout << x + num <<endl; } 
    private: 
     int x; 
}; 

SomeAdder a = SomeAdder (3); 
a(5); //Prints 8 

SomeAdder b(5); 
b(5); //Prints 10 

Các nhà xây dựng và quá tải () điều hành đều gọi là sử dụng dấu ngoặc kép và có cùng loại của các tham số. Trình biên dịch sẽ xác định hàm nào sẽ sử dụng trong các phiên bản của SomeAdder và "các cuộc gọi hàm", để thực hiện hành vi đúng? Câu trả lời có vẻ như nó sẽ hiển nhiên trên bề mặt, nhưng tôi không thể quấn đầu quanh ý nghĩ này.

Cảm ơn bạn đã dành thời gian!

+2

Giống như cách nó phân biệt 'f (x)' với 'g (x)' trong đó 'void f (int); void g (int) ';-) – delnan

+1

Nếu trình biên dịch thấy' SomeAdder (...) ', thì làm thế nào nó có thể nghĩ rằng đó là một cuộc gọi đến một' operator() 'nếu' SomeAdder' là một kiểu? – mfontanini

+0

Thành thật mà nói, tôi cũng nhớ là bị lẫn lộn bởi điều này, ban đầu, quay trở lại khi nào. –

Trả lời

4

Ví dụ của bạn so sánh hàm tạochức năng thành viên bị quá tải operator(). Trình biên dịch biết cái nào cần gọi và khi nào. Nó khá đơn giản:

  • Khi một đối tượng được xây dựng, hàm tạo sẽ được gọi.

  • Hàm thành viên được gọi trên đối tượng đã được tạo. Trong trường hợp của bạn, hàm thành viên là operator().

Điều đó có nghĩa, chúng được gọi trong ngữ cảnh hoàn toàn khác nhau. Không có sự mơ hồ, không nhầm lẫn.

1

Mỗi khi một cá thể của lớp được tạo, phương thức khởi tạo được gọi. Trình biên dịch chắc chắn có thể xác định hàm tạo theo tên của nó. Vì vậy, nó sẽ được gọi là đầu tiên và operator() sẽ là thứ hai.

1

C++ có grammar và từ trình biên dịch sẽ biết (khi đơn giản hóa) khi một kiểu được khởi tạo và do đó một hàm tạo nên được gọi từ trường hợp toán tử quá tải () đang được gọi trên một thể hiện của một lớp.

Cách ngữ pháp được sử dụng để xác định điều này có thể yêu cầu một khóa học về trình biên dịch mà Dragon Book có thể là tiêu chuẩn. Nếu bạn tò mò, bạn cũng có thể xem mục C++ Grandmaster Certification có mục tiêu là xây dựng trình biên dịch C++.

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