Ok, tôi đang làm việc thông qua một cuốn sách và cố gắng tìm hiểu quá tải toán tử C++. Tôi tạo ra một lớp BigInt có một int (ban đầu được thiết lập là 0) cho hàm tạo. Tôi quá tải + = phương pháp và nó chỉ hoạt động tốt trong các mã sau:Toán tử quá tải + trong C++
BigInt x = BigInt(2);
x += x;
x.print(cout);
Mã này sẽ ra 4. Vì vậy, sau đó tôi đã làm việc trên quá tải toán tử toàn cầu + sử dụng đoạn mã sau:
BigInt operator+(const BigInt lhs, const BigInt rhs)
{
BigInt returnValue(lhs);
returnValue += rhs;
return returnValue;
}
này cũng hoạt động tốt cho đoạn mã sau:
BigInt x = BigInt(1);
BigInt y = BigInt(5);
BigInt z = x + y;
z.print();
này in ra 6. Tuy nhiên, khi tôi cố gắng để thực hiện đoạn mã sau, nó chỉ không hoạt động. Cuốn sách không giải thích rõ ràng và ngụ ý rằng nó chỉ đơn giản là làm việc.
BigInt x = BigInt(1);
BigInt z = x + 5;
z.print();
này in ra 1. Tôi không chắc chắn lý do tại sao z là 1 khi nó phải được 6. Tôi googled trực tuyến và trên stackoverflow nhưng tôi không thể tìm thấy bất cứ ai khác mà đã có một vấn đề chính xác như thế này. một số đã gần, nhưng các câu trả lời chỉ không phù hợp. Bất kỳ sự giúp đỡ nào cũng được đánh giá cao!
Tôi không nghĩ rằng điều này có liên quan đến vấn đề của bạn, nhưng vì lợi ích của hiệu quả (và cũng vì nó là thành ngữ trong C++), các đối số cho 'toán tử +' phải được lấy bởi tham chiếu const, chứ không phải theo giá trị, ví dụ: 'BigInt operator + (const BigInt & lhs, const BigInt & rhs)' –
Một điều tôi cứ tự hỏi: Tại sao bạn viết '= BigInt (1)' thay vì chỉ '= 1'? Tôi nghĩ nếu bạn cho chúng tôi thấy định nghĩa lớp học hoàn chỉnh của mình, chúng tôi có thể giúp bạn tốt hơn :) –
Tôi đồng ý với Tyler. Ngoài ra thành ngữ hơn để khởi tạo như 'BigInt x (1);' Cách bạn đang làm nó tạo ra một tạm thời và sau đó gọi ctor bản sao (mặc dù điều đó có lẽ sẽ được tối ưu hóa ra). – Dan