2011-08-23 7 views
9

Giáo viên C++ của tôi nghĩ rằng toán tử * trong tiêu chuẩn C++ là "đã quá tải", bởi vì nó có thể có nghĩa là gián tiếp hoặc phép nhân tùy thuộc vào ngữ cảnh. Ông nhận được điều này từ C++ Primer Plus, trong đó nêu rõ:Nhà điều hành C++ * "đã quá tải chưa?"

Thực tế, nhiều nhà khai thác C++ (và C) đã bị quá tải. Ví dụ, toán tử *, khi được áp dụng cho một địa chỉ, sinh ra giá trị được lưu trữ tại địa chỉ đó. Nhưng việc áp dụng * cho hai số sẽ tạo ra sản phẩm của các giá trị. C++ sử dụng số lượng và loại toán hạng để quyết định hành động cần thực hiện. (pg 502, 5th ed)

Ít nhất một sách giáo khoa khác nói nhiều như nhau. Cho đến nay tôi có thể nói, điều này không đúng; unary * là một toán tử khác với nhị phân * và cơ chế mà trình biên dịch làm cho chúng không có gì liên quan đến quá tải của toán tử.

Ai là đúng?

+3

Bạn nói đúng. Trong một nghĩa nào đó, nó là công bằng để nói rằng các nhà khai thác xây dựng đã hành động polymorhpically tùy thuộc vào đối số của họ. Đó là tính đa hình tĩnh – sehe

+7

Lưu ý rằng ngoài việc có hai toán tử '*' (nghĩa là "quá tải" theo nghĩa tiếng Anh nhưng không theo nghĩa C++), mã nhị phân dựng sẵn '*' thực sự cũng bị quá tải theo nghĩa C++, trong nó áp dụng cho các kiểu khác nhau - 'int',' double', vv - với các hiệu ứng khác nhau. Bộ quá tải hiệu quả cho mục đích của độ phân giải quá tải của nhà điều hành được xác định trong tiêu chuẩn, tại 13.6/12.Tương tự như vậy '*' có hiệu quả quá tải cho mọi kiểu con trỏ (13.6/6) và kiểu con trỏ hàm (/ 7). –

Trả lời

12

Cả hai đều đúng khi câu hỏi phụ thuộc vào ngữ cảnh và ý nghĩa của quá tải từ.

"Quá tải" có thể mang ý nghĩa chung của "cùng một biểu tượng, ý nghĩa khác" và cho phép tất cả việc sử dụng "*" bao gồm cả gián tiếp và phép nhân và bất kỳ hành vi do người dùng xác định.

"Quá tải" có thể được sử dụng để áp dụng cho chức năng quá tải của nhà điều hành chính thức của C++, trong trường hợp đó, tính ngẫu nhiên và phép nhân thực sự khác nhau.

BỔ SUNG: Xem nhận xét của Steve bên dưới, trên "điều hành tải" các câu "mã thông báo quá tải".

+15

Vì vậy, ngay cả cụm từ "quá tải" bị quá tải. –

+7

Để được chính xác, tôi nghĩ rằng với ý nghĩa trước đây đó là '*' mã thông báo đó là quá tải, không phải là nhà điều hành '*'. Đó là một mái tóc rất tốt để chia, mặc dù, tôi nói đó là mã thông báo chỉ vì ngữ pháp của một biểu thức bằng cách sử dụng unary '*' là khác với ngữ pháp của một biểu thức bằng cách sử dụng nhị phân '*'. Bạn có thể tưởng tượng rằng cả hai đều được chuyển thành 'operator * (...)', với một đối số cho unary và hai cho binary, trong trường hợp nó hoạt động giống như một hàm overloaded duy nhất có tên 'operator *'. Đó không phải là hoàn toàn tiêu chuẩn xảy ra để xác định các biểu thức số học. –

+1

@Steve Tôi hoàn toàn đồng ý và thích độ chính xác đó. Tôi sẽ lấy câu trả lời đó cho tôi. :) –

2

Tôi tin rằng bạn đang có. Các dereference op và mult. op là các toán tử khác nhau, ngay cả khi được viết giống nhau. tương tự cho +, -, ++, -, và bất kỳ thứ gì khác mà tôi có thể đã quên.

Tôi tin rằng cuốn sách, trong đoạn này, đề cập đến từ "quá tải" là "được sử dụng trong hơn 1 cách", nhưng không phải bởi người dùng. Vì vậy, bạn cũng có thể xem xét cuốn sách là chính xác ... cũng phụ thuộc nếu bạn đang đề cập đến quá tải của toán tử * hoặc của toán tử phép nhân (ví dụ).

1

Nó bị quá tải theo nghĩa là cùng một ký tự được sử dụng để có nghĩa là những thứ khác nhau ở những nơi khác nhau (ví dụ: dereference con trỏ, nhân giữa int s, phép nhân với các kiểu tích hợp khác, v.v.).

Nói chung, tuy nhiên, "điều hành quá tải" dùng để chỉ định một nhà điều hành (có ký hiệu giống như một built-in một) sử dụng mã tùy chỉnh để nó làm điều gì đó thú vị với một người dùng định nghĩa kiểu.

Vì vậy, ... cả hai bạn đều đúng :-)