Anh (Chị) hãy cho biết, chương trình sau sai ở dòng nào?
1. class CRect {
2 .int *height, *width;
3. public :
4. CRect (int,int);
5. ~CRect ();
6. int DT (void) { return (height * width); }
7. }
8. CRect::CRect (int a, int b) {
9. height = new int;
10. width = new int;
11. *height = a;
12. *width = b;
13.}
14. CRect::~CRect() {
15. delete height;
16. delete width;
17. }
18. int main() {
19. CRect cn1 (3,4);
20. cout << cn1.DT();
21. return 0;
22. }
Trả lời:
Đáp án đúng: A
Đoạn chương trình trên có lỗi ở dòng số 6.
Dòng 6: `int DT (void) { return (height * width); }`
**Giải thích:**
* `height` và `width` là các con trỏ (`int *`). Để lấy giá trị mà chúng trỏ tới, cần phải sử dụng toán tử `*`.
* Phép nhân `height * width` thực hiện phép nhân trên địa chỉ bộ nhớ mà `height` và `width` đang lưu giữ, thay vì nhân giá trị số nguyên mà chúng trỏ tới. Điều này dẫn đến kết quả sai lệch hoặc không xác định.
* Để tính diện tích đúng, cần phải truy cập giá trị mà `height` và `width` trỏ tới bằng cách sử dụng `*height * *width`.
**Sửa lại:**
Sửa dòng 6 thành: `int DT (void) { return (*height * *width); }`
Vậy đáp án đúng là A.