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

Đề tài: Giải thích dùm em về hàm sử dụng const

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

    Mặc định Giải thích dùm em về hàm sử dụng const

    Em thật sự không hiểu hàm này
    Code:
    class A { 
    public: 
        void Foo() const; 
        void Moo(); 
    private: 
        int m_nState; // Could add mutable keyword if desired 
        int GetState() const   { return m_nState; } 
        void SetState(int val) { m_nState = val; } 
    }; 
    const A *A1 = new A(); 
    A *A2 = new A(); 
    A1->Foo(); // OK 
    A2->Foo(); // OK 
    A1->Moo(); // Error - Not allowed to call non-const function on const object instance 
    A2->Moo(); // OK
    Hàm void Foo() const; nó sử dụng như thế nào?
    Và tại sao lại lỗi ở A1->Moo() ?
    Ta Tự Hào Từ Hai Bàn Tay Trắng Lập Nên "Vô Số Nợ"

  2. #2
    Ngày gia nhập
    08 2010
    Nơi ở
    Moscow, Russia Federation
    Bài viết
    913

    const - giá trị hằng

    Vậy từ khóa const nằm sau khai báo hàm và trước thân hàm ngụ ý điều gì? Chắc chắn có cái gì đấy phải là cố định, không thay đổi được sau khi từ khóa const được đặt? Vậy sau từ khóa const là gì? Đó là thân hàm.

    Nhưng trong thân hàm có cái gì? Bây giờ ta mới bạn đến hàm void Foo() const; của bạn. Nó là một phương thức hàm, thuộc về class A. Trong thân hàm này có thể sử dụng tất cả các public + protected + private attributes của class A. Vì thế, từ khóa const được sử dụng để đòi hỏi các thuộc tính của A không bị thay đổi trong thân hàm Foo();

    Tại sao? Có nhiều khi, chúng ta viết những hàm chỉ để truy xuất nội dung của một object của một class thôi chứ không có nhu cầu thay đổi nội dung của nó, chẳng hạn các hàm để đọc dữ liệu, ... Tuy nhiên để tránh các trường hợp sai sót có thể gây ra mất an toàn dữ liệu (lấy một ví dụ đơn giản, thường hay nhầm lẫn phép logic == với phép gán =) nên các lập trình viên mượn const để kiểm soát điều này.
    Mời các bạn ghé thăm blog cá nhân của tôi

  3. #3
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Cái code này chắc bạn chôm ở thí dụ về cách sử dụng hàm const. Lúc đưa ra code này, người ta có giải thích mà, chắc tại giải thích bằng tiếng Anh.

    từ const đi sau tên hàm là một câu hứa hẹn rằng code bên trong hàm không thay đổi thuộc tính của đối tượng lớp. Nói một cách khác, hàm hứa hẹn rằng sau khi chạy xong, đối tượng gọi hàm này không hề thay đổi - tức là hàm làm một việc gì đó, nhưng việc này không làm thay đổi tính chất và trạng thái đối tượng.

    Vì vậy trình dịch sẽ báo lỗi nếu lời hứa hẹn trên bị xâm phạm. Những trường hợp xâm phạm là:

    - bên trong hàm có code sửa đổi một thuộc tính nào đó.

    - bên trong hàm có code gọi một hàm khác không có lời hứa const. Bởi vì trình dịch không biết là hàm được gọi có ảnh hưởng gì đến đối tượng hay không.

    - một đối tượng thuộc dạng const gọi một hàm không phải dạng const. Bởi vì trình dịch không biết là hàm được gọi có ảnh hưởng gì đến đối tượng hay không.

    Như vậy, để tránh trình dịch báo lỗi, ta phải tuân theo quy luật sau:

    - Code bên trong hàm const chỉ được quyền truy trị của thuộc tính lớp nhưng không được thay đổi bất cứ thuộc tính nào.

    - Hàm const chỉ được quyền gọi hàm const khác, và không được quyền gọi hàm không const

    - đối tượng const chỉ được quyền gọi hàm const, và không được quyền gọi hàm không const

    (đương nhiên người ta có cách qua mặt trình dịch để làm các công việc bị ngăn cấm trên. Nhưng đó là chuyện của dân xịn)

    Tại sao lại phải "const" một cái hàm?

    Hiển nhiên là nếu hàm không phải là const thì đối tượng const không gọi được.
    Có nhiều class viết rất phức tạp và kế thừa tùm lum. "const" là một hình thức giúp người thiết kế lớp bảo vệ đối tượng. Cái này giải thích rất dài dòng. Bao giờ bạn phải làm một đồ án có sẵn hàng trăm lớp, và phải lấy đối tượng, thừa kế lớp một lúc thì sẽ thấy sự hữu hiệu của hàm const.

    tb. thực ra đề tài này đã từng được giải thích cặn kẽ rồi. Chỉ tại bạn lười tìm kiếm các bài viết cũ thôi.

  4. #4
    Ngày gia nhập
    04 2010
    Bài viết
    3

    Thank you 2 bạn...
    Ta Tự Hào Từ Hai Bàn Tay Trắng Lập Nên "Vô Số Nợ"

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

  1. Lập trình C++0x const: ý nghĩa của const trong khai báo function
    Gửi bởi quano1 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 13
    Bài viết cuối: 06-08-2013, 07:24 AM
  2. Tìm hiểu về từ khóa const - const với nhiều ý nghĩa
    Gửi bởi langman trong diễn đàn Tutorials và Thủ thuật Visual C++
    Trả lời: 1
    Bài viết cuối: 19-12-2011, 12:00 PM
  3. lỗi cannot convert `const char*' to `const WCHAR*' for argument khi dùng autoit với c++
    Gửi bởi morongtraitim88 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 03-06-2011, 08:54 PM
  4. const A* const method(const A* const) const;//const thứ 2
    Gửi bởi david8xvn trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 18
    Bài viết cuối: 23-09-2010, 12:36 AM
  5. [VC] Cannot convert parameter 1 from 'const char [23]' to 'const wchar_t *'
    Gửi bởi lychailon trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 4
    Bài viết cuối: 09-12-2006, 11:22 AM

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