Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: [ Solved ]Constructor và toán tử gán bằng

  1. #1
    Ngày gia nhập
    10 2008
    Bài viết
    1

    Mặc định [ Solved ]Constructor và toán tử gán bằng

    Lúc mới học về hai khái niệm này thì mình chẳng có thắc mắc gì cả (cứ tưởng là hiểu hết rồi ) nhưng đến khi làm bài nhiều mới nảy ra thắc mắc. Ở trường mình giao bài tập xây dựng một chương trình tính toán (+ - *) với các biểu thức số nguyên (vd: 3x^2 + 2x). Làm đến hàm trừ, vd a-b (a, b là hai biểu thức nguyên) thì mình lấy a + (-b). Ban đầu doạn code của mình như sau:
    C++ Code:
    1. DaThuc DaThuc::operator - ()
    2. {
    3.     DaThuc temp (this->n);
    4.     for (int i = this->n; i >= 0 ; i--)
    5.         temp.a[i] = -(this->a[i]);
    6.     return temp;
    7. }
    8. DaThuc DaThuc::operator - (const DaThuc &d)
    9. {
    10.     DaThuc temp = d;
    11.     return *this + (-temp);
    12. }
    Hàm gán bằng như sau:
    C++ Code:
    1. DaThuc& DaThuc::operator = (const DaThuc &d)
    2. {
    3.     if (this == &d)
    4.         return *this;
    5.     delete [] this->a;
    6.     this->a = new int[d.n];
    7.     this->n = d.n;
    8.     for (int i = 0; i <= d.n; i++)
    9.         this->a[i] = d.a[i];
    10.     return *this;
    11. }
    Hàm cộng thì mình đảm bảo chính xác rồi nhưng cứ chạy hàm trừ này xong là đa thức bị trừ lại bị thay đổi giá trị mặc dù đã là const???
    Sửa mãi không được nên mình chuyển qua dùng constructor. Chương trình đổi thành:
    C++ Code:
    1. DaThuc::DaThuc (const DaThuc &b)
    2.     {
    3.         n = b.n;
    4.         a = new int[n+1];
    5.         for (int i = 0; i <= n; i++)
    6.                 a[i] = b.a[i];
    7.     }
    8. DaThuc DaThuc::operator - (const DaThuc &d)
    9. {
    10.     //DaThuc temp = d;    // Neu khong co constructor DaThuc(const DaThuc &b) thi chay sai???
    11.     DaThuc temp (d);
    12.     return *this + (-temp);
    Chương trình chạy đúng.
    Mình thử lại bằng cách dùng toán tử gán bằng (vẫn để constructor) thì lần này lại chạy đúng???, tức là:
    C++ Code:
    1. DaThuc::DaThuc (const DaThuc &b)
    2.     {
    3.         n = b.n;
    4.         a = new int[n+1];
    5.         for (int i = 0; i <= n; i++)
    6.                 a[i] = b.a[i];
    7.     }
    8. DaThuc DaThuc::operator - (const DaThuc &d)
    9. {
    10.     DaThuc temp = d;    // Neu khong co constructor DaThuc(const DaThuc &b) thi chay sai???
    11.     //DaThuc temp (d);
    12.     return *this + (-temp);
    Mình lại thử sửa lại hàm gán bằng bằng cách dùng constructor:
    C++ Code:
    1. DaThuc& DaThuc::operator = (const DaThuc &d)
    2. {
    3.     if (this == &d)
    4.         return *this;
    5.     delete [] this->a;
    6.     *this = DaThuc(d);
    7.     return *this;
    8. }
    thì chương trình gặp lỗi khi chạy đến chỗ thực hiện phép trừ
    Bạn nào hiểu vì sao thì giải thích cho mình với. Mình xài Code::Block 8.02
    Đây là "nguyên văn" bài của mình:
    Attached Files Attached Files

  2. #2
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    C++ Code:
    1. DaThuc temp = d;    // Neu khong co constructor DaThuc(const DaThuc &b) thi chay sai???
    Khi dùng cú pháp này để khai báo thì nó không sử dụng toán tử gán, nó gọi copy constructor.
    Cậu viết thử 1 đoạn nhỏ rồi in ra từng lời gọi hàm sẽ hiểu tại sao !

  3. #3
    Ngày gia nhập
    10 2008
    Bài viết
    1

    Sao anh rox_rook rành mấy chi tiết này quá vậy. Mấy sách mà em đọc chẳng có nói đến chuyện này gì cả. Cảm ơn anh nhiều.

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Chắc có lẽ sách tiếng Việt nó không có đề cập, chứ sách tiếng Anh mà anh đọc thì cuốn nào cũng có đề cập cả !

  5. #5
    Ngày gia nhập
    10 2008
    Bài viết
    1

    Anh gợi ý cho em biết cuốn nào với. Em đang đọc cuốn The C Programming Language (nhưng mà em cũng lười nên có nhiều chỗ chỉ đọc lướt) và các slide bài giảng của cuốn Absolute C++ (không chi tiết nhưng mà dễ nắm ý chính). Ở trường thầy có gợi ý cho đọc cuốn Thinking in C++ nhưng mà em chưa thử (mấy cuốn "thinking" đọc là dễ nản lắm) .
    Đã được chỉnh sửa lần cuối bởi tunglun : 13-11-2008 lúc 01:50 PM.

  6. #6
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định [ Solved ]Constructor và toán tử gán bằng

    - Thinking C++ đọc sau.
    - Đọc các cuốn sau :
    1. Starting out C++( cuốn này rất hay tuy vậy sợ em tìm ebook không có )
    2. C++ How to program( cuốn này là cuốn anh bắt đầu )
    Một số cuốn khác hay mà anh đã từng đọc :
    - Absolute C++ cũng hay.
    - C++ By Dissection cũng có 1 số ý hay giống Absolute C++
    - Learn C++ in 21 days( cuốn này cũng có 1 số idea rất tuyệt )
    - C++ from the Ground up, cuốn này cũng ok.
    - The Element style C++.
    - Waite Group's Object-Oriented Programming in C++, Third Edition( cuốn này có rất nhiều người khen tuy vậy lúc anh đọc cuốn này thì anh thấy nó cũng ok thôi, khá cơ bản, rất detail ).
    Đây là 1 số cuốn dành cho beginner.
    - Thingking in C++ là Intermediate rồi, em chưa cần đọc vội làm gì. Lên đến level này cần thì nói anh sẽ cho 1 số tựa để đọc. Tuy vậy sách C++ rất khó tìm 1 sách cover hết tất cả, mỗi sách nó có 1 cái hay riêng, trùng nhau cũng có vì vậy đọc càng nhiều thì càng hiểu sâu. Mấy cuốn ở trên cần cuốn nào thì vào kho ebook request, anh sẽ post cho.

  7. #7
    Ngày gia nhập
    11 2008
    Bài viết
    9

    Đọc quá trời sách Tiếng Anh gốc ko vậy rox_rook - Thế ko giỏi mới là lạ

Các đề tài tương tự

  1. Tại sao không thể tự gọi tới constructor thích hợp
    Gửi bởi silverbretdn trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 5
    Bài viết cuối: 02-11-2012, 11:07 AM
  2. Lỗi no copy constructor available or copy constructor is declared 'explicit'
    Gửi bởi tun_tun trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 09-09-2012, 06:02 PM
  3. [ Solved ]Constructor Assignment w/ operator
    Gửi bởi bvKim trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 12
    Bài viết cuối: 19-11-2008, 11:41 AM
  4. [ Solved ]Constructor và toán tử gán bằng
    Gửi bởi tunglun trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 5
    Bài viết cuối: 13-11-2008, 02:13 PM
  5. [ Solved ]Hỏi 1 tí về copy constructor
    Gửi bởi ktwiz trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 21-03-2008, 01:26 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn