2010-11-16 55 views
8

Tại sao toán tử quá tải = bắt buộc phải là hàm thành viên ($ 13.5.3), nhưng không phải là toán tử gán phép, ví dụ: toán tử + = ($ 13.5.2)? Tôi có nhìn cái gì ở đây không?Quá tải toán tử

+0

bản sao có thể có của [Tại sao chức năng người bạn không thể được sử dụng cho quá tải toán tử gán?] (Http://stackoverflow.com/questions/3933637/why-friend-function-cant-be-used-for-overloading- assignment-operator) –

Trả lời

2

Các phần bạn tham khảo có điều này để nói về cất giấu triển khai lớp cơ sở của operator=

Bởi vì một toán tử gán bản sao operator= được ngầm tuyên bố cho một lớp nếu không khai báo bởi người dùng (12,8),

Đây cũng có thể là câu trả lời cho câu hỏi của bạn, vì trình biên dịch cần biết liệu nó có nên tạo ra một operator= hay không. nó đã được xác định trong một đơn vị dịch thuật khác.

ví dụ:

//a.h 
class A { }; // compiler thinks A::operator= should be implicitly defined 

//b.h 
#include "a.h" 
A& operator=(A& This, const A& other) { /*...*/ } // Oops it's explicitly defined 

Các toán tử kết hợp không được xác định rõ ràng do đó không có lý do nào để buộc chúng được khai báo là hàm thành viên.

+0

Sau đó, tôi sẽ tưởng tượng toán tử + = cũng được yêu cầu là thành viên – Chubsdad

+0

toán tử + = không được khai báo hoàn toàn. – flodin

+0

@flodin: chức năng gọi opera, ví dụ: được yêu cầu làm hàm thành viên. Tại sao? Ngay cả điều đó cũng không được khai báo rõ ràng – Chubsdad

4

Việc gán bản sao operator=, làm thành viên, luôn được trình biên dịch cung cấp nếu người dùng không xác định. Tôi tin rằng nó chỉ là để đơn giản và để tránh những mơ hồ không mong muốn mà nó đã được thực hiện một yêu cầu rằng operator= không thể được định nghĩa là một chức năng miễn phí.

Nhà điều hành chuyển đổi xử lý trường hợp khi bạn muốn chỉ định từ loại do người dùng xác định thành loại được cài sẵn.

+0

Vì vậy, câu hỏi của tôi, tôi đoán bây giờ là lý do tại sao các nhà khai thác nhất định được uỷ quyền bị quá tải như các thành viên, ví dụ: toán tử [], toán tử() trong khi các toán tử khác thì không? – Chubsdad

+1

@ Chubsdad, không, đó không phải là câu hỏi của bạn, đó là một câu hỏi khác, hãy trả lời câu hỏi đó nhưng Charles (và những người khác) đã trả lời câu hỏi này. – Motti

+0

@Motti: Không chắc điều này có xảy ra với bạn hay không, nhưng điều đó xảy ra với tôi ít nhất. Trong khi thảo luận và chia sẻ, rõ ràng hơn nhiều xuất hiện về những gì người ta muốn – Chubsdad

1

Cùng với các hàm tạo mặc định và sao chép, toán tử = cũng được xử lý đặc biệt trong C++. Điều đó có nghĩa, ngay cả khi bạn không khai báo, trình biên dịch sẽ cung cấp một cài đặt mặc định cho bạn. Nhưng việc triển khai mặc định không phải lúc nào cũng là hành vi phù hợp với nhu cầu của lớp học của bạn, đó là lý do tại sao bạn nên khai báo chúng một cách rõ ràng (hoặc ẩn chúng, bằng cách gán khả năng hiển thị riêng).

Và tại sao hàm tạo mặc định, sao chép hàm tạo và toán tử gán nên đặc biệt? Bởi vì chúng tham gia vào khởi tạo biến chuẩn và truyền tham số: khi bạn chuyển một tham số kiểu lớp cho một hàm theo giá trị (không phải bằng tham chiếu hoặc con trỏ), các hoạt động này được gọi để sao chép nội dung của nó vào ngăn xếp.

1

Như đã nêu bởi Charles, việc gán bản sao operator= luôn được trình biên dịch cung cấp nếu người dùng không xác định. Trình biên dịch này cung cấp chức năng thành viên sẽ luôn được ưu tiên hơn một hàm không phải thành viên, vì vậy ngay cả khi bạn có thể xác định nó như là một hàm không phải thành viên, nó sẽ không được gọi.