2011-11-17 63 views
6

thể trùng lặp:
List of C++ name resolution (and overloading) rulesChức năng quá tải trong C++

các quy tắc trong C++ cho cách trình biên dịch quyết định những hoạt động để lựa chọn là gì? (có hai chức năng có cùng tên - trình biên dịch chọn/ưu tiên một chức năng như thế nào, chủ yếu là tôi muốn biết loại trình biên dịch nào sẵn sàng làm khi chọn)

+1

Bạn có nghĩa là ghi đè không? – MGZero

+2

Các quy tắc rất nhiều ... và phức tạp. Tất cả điều này được đề cập trong phần ** 3.4 ** của tiêu chuẩn C++ –

+0

@MGZero - không ... – Belgi

Trả lời

4

Như đã nêu, các quy tắc được mô tả đầy đủ trong tiêu chuẩn. Như một quy tắc cơ bản của ngón tay cái, trình biên dịch sẽ chọn quá tải yêu cầu chuyển đổi tự động ít nhất, với báo trước rằng nó sẽ không bao giờ áp dụng 2 chuyển đổi do người dùng xác định.

Loại số nguyên được tự động truyền xung quanh rất nhiều. Vì vậy, nếu bạn có một hàm bị quá tải trên một số intdouble, thì trình biên dịch sẽ chọn hàm int nếu được gọi với hằng số là số nguyên. Nếu bạn không có phiên bản int, trình biên dịch sẽ chọn double. Và trong số các loại số nguyên khác nhau, trình biên dịch thích int cho các hằng số nguyên, vì đó là kiểu của chúng. Nếu bạn quá tải trên shortunsigned short, nhưng được gọi với hằng số 5, trình biên dịch sẽ phàn nàn rằng nó không thể tìm ra tình trạng quá tải để sử dụng.

Sách của Scott Meyers thực sự có giải thích tốt nhất mà tôi từng đọc.

+0

"Scott Meyers 'book". Bạn có thể cụ thể hơn bằng cách đặt tên cho tiêu đề của cuốn sách không? –

+0

Đối với cuộc sống của tôi, tôi không thể tìm thấy nó ngay bây giờ. +1 cho bất kỳ ai có tham chiếu? – drdwilcox

+0

Sách của Scott Meyers: http://www.aristeia.com/books.html; tham chiếu có lẽ là hiệu quả C++ hoặc có thể hiệu quả hơn C++. – pnkfelix

0

toàn bộ tên hàm bao gồm những gì bạn gọi là hàm cũng như danh sách tham số. Vì vậy, logic, 2 chức năng được gọi là cùng một điều nhưng với danh sách tham số khác nhau cả hai đều có "tên đầy đủ" khác nhau. Thuật ngữ của tôi có lẽ hơi lệch, vì vậy nếu ai đó muốn sửa chữa điều đó, hãy cảm thấy tự do.

+1

nói bạn có doSomething (int x) và doSomething (short x), trình biên dịch nào chọn khi bạn gọi doSomething (5)? – Tom

+0

Ahh, điều đó khiến nó thú vị hơn! Câu hỏi hay, và ngoài tầm hiểu biết của tôi. Tôi cảm thấy như nó sẽ phụ thuộc vào những gì trình biên dịch xem xét 5 được. Tôi có khuynh hướng nói int, nhưng tôi không chắc chắn chút nào. – MGZero

+1

Nó sẽ chọn phiên bản 'int'. – drdwilcox

0

Nó dựa trên loại đối số. Không cần phải tham gia nếu loại không khớp với nó đơn giản sẽ không biên dịch.

+0

Xem nhận xét của tôi về bài đăng của MGZero – Tom

+0

Đối với những gì tôi biết nếu bạn có void f (double x) và bạn gọi f (5) comiles và 5 được đúc thành 5.0 – Belgi

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