cách chương trình C++ tính toán thành "ACCA"?
Chữ cái đầu tiên được hiển thị là 'A'. Kết quả này có liên quan đến dòng này:
Base obj;
... trong đó bạn đang tạo một phiên bản mới của Base.
Dòng tiếp theo là một chút phức tạp:
obj = obj+obj;
Thông thường, điều này được phiên dịch sang obj.operator+(obj)
, nhưng bạn không có nhà điều hành + quá tải trong lớp Base
, vì vậy dịch này không hợp lệ. Khả năng còn lại là toán tử + thực sự là toán tử thêm số.
Và có, điều này là có thể, vì bạn đã cung cấp dàn diễn viên cho int
. Vì vậy, nó có thể chuyển đổi mỗi thuật ngữ của phương trình trong một int
... và do đó operator int
được gọi là hai lần. Số lần thực tế operator int
được gọi phụ thuộc vào kích hoạt tối ưu hóa. Ví dụ, trình biên dịch có thể nhận ra rằng cả hai điều khoản là như nhau, và sau đó tạo ra một tạm thời mới khi operator int
đã được gọi là lần đầu tiên. Trong trường hợp đó, bạn sẽ thấy CA thay vì CC.
Cuối cùng, biểu thức gán obj.operator=(temp)
được thực hiện. Và tại đây từ khóa là temp. Để cho defaultoperator=
hoạt động, vì nó không bị quá tải, bạn phải có đối tượng Base
ở bên phải. Nó thực sự là có thể có nó, vì Base
sử dụng một int
để tạo các phiên bản mới. Được rồi, vì vậy kết quả của obj + obj
là một int
(nói nó được gọi là 'x') số lượng, và trình biên dịch tạo ra một đối tượng tạm thời của lớp Base
mà được xây dựng với số x, như dòng sau được thực hiện:
Base temp(x);
Đó là cách chữ cái cuối cùng được xem là 'A'. Một lần nữa, nhiều trình biên dịch có thể tránh việc xây dựng các thời gian trên một số trường hợp, do đó, có thể không nhìn thấy chữ 'A' ở cuối.
Lưu ý rằng dòng này:
obj = obj + obj
Được như vậy, bị phân hủy trong:
int x = ((int) obj) + ((int) obj);
Base temp(x);
obj = temp;
Các hướng dẫn chính thức có kết quả như là nếu bộ nhớ trong đó obj
ngồi sẽ được bận rộn với các nội dung của temp
(đó là vai trò của hàm tạo bản sao mặc định, thực hiện operator=
cho mỗi thành viên của lớp, xem lại 'quy tắc ba').
Quá tải toán tử liên quan đến rất nhiều vấn đề có thể không được dự đoán nếu bạn không có kiến thức sâu sắc về ngôn ngữ, như bạn có thể thấy. Cũng cần lưu ý rằng các ngôn ngữ như Java hoàn toàn ngăn cản việc sử dụng nó, trong khi C# cho phép nó từ một góc nhìn được kiểm soát.
FYI; Đây là một cấu trúc được tạo ra để tạo ra ACCA, như một bài tập cho người đọc. –