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

Đề tài: [ Solved ]Đối tượng hằng, phương thức hằng!!! Khi nào cần dùng ???

  1. #1
    Ngày gia nhập
    03 2008
    Nơi ở
    Đà Nẵng city
    Bài viết
    40

    Wink [ Solved ]Đối tượng hằng, phương thức hằng!!! Khi nào cần dùng ???

    Như tiêu đề của topic, mặc dù vẫn biết trên phương diện lý thuyết là hằng là ko thay đối ( không thể hoặc không muốn ) nhưng như vậy thì đối với mình mơ hồ quá, mình có đọc 1 số code, hiểu thì hiểu , viết thì được( trừ đoạn liên quan cái này ra ), nhưng lại có vài đoạn ko cần đến phương thức hoặc đối tượng hằng thì người viết lại khai báo nó vào.
    Chẳng hạn như mình thường thấy các đoạn code về overloading toán tử gán "=" được khai báo là phương thức hằng hoặc trả về kiểu dữ liệu hằng, trong đó còn truyền thêm đối là đối số hằng trong khi nếu ko có nó thì vẫn bt, có tìm hiểu, nhưng cũng chưa rõ mấy.
    Ví dụ như đoạn code sau : ( giáo trình How To Program C++ )
    C++ Code:
    1. class String
    2. {
    3.      friend ostream &operator<<( ostream &, const String & );
    4.      friend istream &operator>>( istream &, String & );
    5.  
    6. public:
    7.      String( const char * = "" ); // conversion/default constructor     // const ??????
    8.      String( const String & ); // copy constructor   // const ????????          
    9.      ~String(); // destructor                                      
    10.  
    11.      const String &operator=( const String & ); // assignment operator   // const ????????
    12.      const String &operator+=( const String & ); // concatenation operator //// const ????????
    13.      ...........
    14. }
    Ở hàm contructor nếu ko có const thì vẫn chạy bt thôi, nếu có nó vào thì sao, ko có thì sao ?Tương tự ở toán tử gán "=" , nó trả về đối tượng kiểu String, nhưng có const thì sao, ko có thì sao ?

    Hoặc đoạn code sau ( giáo trình Phạm Văn Ất - C++ ):
    C++ Code:
    1. class MON_HOC
    2. {
    3.         private:
    4.                   char * ten_mh;
    5.                   int sotiet;
    6.         public:
    7.                  .......
    8.                  const MON_HOC & operator=( const MON_HOC & m );// gán
    9.                  ........
    10. }
    Mình mới học lập trình, còn j sai sót thì giúp nha, mục đích diễn dàn là vậy mờ
    Rất chi là cảm ơn mấy bạn đó đó )
    Đã được chỉnh sửa lần cuối bởi camping29 : 16-11-2008 lúc 12:01 AM. Lý do: Thêm thông tin bài viết

  2. #2
    Ngày gia nhập
    04 2008
    Nơi ở
    HCMC
    Bài viết
    251

    Ko có chắc không sao. Nhưng mình nghĩ là để mình tránh tránh thay đổi dữ liệu trong hàm. Thông thường những nơi đặt const là không muốn đối tượng ở sau const bị thay đổi (chương trình dài, nhỡ ta quên thay đổi mất giá trị tham số truyền vào thì sao).
    C++ Code:
    1. for(;;){cout<<"Busy"<<endl;}
    2. system("cls");
    Hãy ủng hộ cho quỹ phát triển cộng đồng C Việt
    http://congdongcviet.com/quyphattrien-congdongcviet.cpp

  3. #3
    Ngày gia nhập
    11 2008
    Nơi ở
    Neverland
    Bài viết
    48

    Không có cũng không sao nhưng đối với các chương trình lớn nên làm vậy để còn dễ bảo trì hơn . Cho các biến hằng vào giúp người viết có thể tránh được các lỗi như lỡ tay thay đổi nó trong đoạn nào đó của chương trình chẳng hạn . Hoặc có thể để tránh những tay hacker táy máy chăng ???
    I'm superman

  4. #4
    Ngày gia nhập
    03 2008
    Nơi ở
    Đà Nẵng city
    Bài viết
    40

    HUmmm chỉ có vậy thoy àh, humm ........ có lời giải thích nào rõ ràng hơn chut hem

  5. #5
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    @camping29 : Mình thấy rõ ràng quá rồi còn gì. Khi để kiểu const truyền vào hàm tức là người lập trình ko muốn giá trị của tham số đó bị thay đổi sau khi kết thúc hàm. Lỗi này có thể do thuật toán trong hàm bị sai ở đâu đó, nếu có const trình biên dịch sẽ kiểm tra thấy và báo lỗi ngay. Nếu ko có const thì người lập trình ko phát hiện ra lỗi đó -> tham số truyền hàm bị thay đổi giá trị và có thể ảnh hưởng đến hàng loạt các hàm sau đó nếu dùng tham số này.

    @trung_dk070384 : const chỉ có ý nghĩa với trình biên dịch thôi, khi biên dịch xong thì const và biến đều như nhau cả. Có khác chăng thì const sẽ được nằm chung với đoạn mã máy của chương trình và vùng nhớ này nếu trong win thì sẽ là readonly. Tuy nhiên bảo vệ kiểu này cũng vô dụng vì cũng có cách set lại thuộc tính đọc-ghi lại cho vùng nhớ này.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

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

    Mặc định [ Solved ]Đối tượng hằng, phương thức hằng!!! Khi nào cần dùng ???

    Trong C++, trả về 1 copy và const reference là như nhau, nhưng trả về copy thì compiler ngầm định gọi thêm 3 thằng :
    - constructor for local object
    - copy constructor for local object.
    - destructor for local object return.
    Cậu gọi 1 chục lần thì cậu tưởng tượng bao nhiêu lần gọi hàm ?
    Còn tại sao return const ref thì nhìn vào tham số là hiểu và nó là để dùng kĩ thuật cascading : a = b = c;
    Vì b.operator=( c ) trả về const ref& X;
    và tiếp tục nó sẽ gọi a.operator( X ); Mặc dù a bị thay đổi nhưng cái nó trả về là không thể thay đổi.

  7. #7
    Ngày gia nhập
    03 2008
    Nơi ở
    Đà Nẵng city
    Bài viết
    40

    Thx mèo với rox nhìu nhìu.
    @rox_rook : nếu ở phần trả về , mình ko báo const thì vẫn có thể dùng cascading bình thường mà, nếu có thêm const thì sao? Cái này vẫn chưa hiểu lắm.

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

    Tất nhiên trả về ref& thì vẫn ok, có điều ví dụ :
    C++ Code:
    1. #include <iostream>
    2.  
    3. using namespace std;
    4.  
    5. class My {
    6.     int x;
    7. public :
    8.     explicit My( int x ):x( x ) {
    9.     }
    10.     My& operator =( const My& rhs ) {
    11.         if( this != &rhs ) {
    12.             x = rhs.x;
    13.         }
    14.         return *this;
    15.     }
    16.     void setX( int xx ) {
    17.         x = xx;
    18.     }
    19.     friend ostream& operator <<( ostream& o, const My& rhs ) {
    20.         return o << rhs.x << "\n";
    21.     }
    22. };
    23.  
    24. int main() {
    25.     My c1( 5 );
    26.     My c2( 3 );
    27.  
    28.     My& a = c1 = c2;
    29.     a.setX( 100 );
    30.     cout << c2 << "\n";
    31.     cout << c1 << "\n";
    32.  
    33.     return 0;
    34. }
    Vậy a thay đổi luôn cả dữ liệu của c2 thế này được à ? Think about it

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

  1. [ Solved ]Chỉ dùng một đối tượng A?
    Gửi bởi hahonga3 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 17
    Bài viết cuối: 14-11-2008, 09:51 PM
  2. [ Solved ]Hàm cộng 2 số lớn dùng mảng int
    Gửi bởi reddevils528 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: 19-10-2008, 02:49 PM
  3. [ Solved ]Lỗi khi dùng template
    Gửi bởi kidyboy2003 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 15
    Bài viết cuối: 13-10-2008, 01:01 AM
  4. [ Solved ]Lỗi khi dùng dịch bằng Dev C++
    Gửi bởi Huyx trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 9
    Bài viết cuối: 25-09-2008, 10:20 AM
  5. [Solved]lập trình cho hệ thống nhúng dùng C/C++
    Gửi bởi luon07 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 14-03-2008, 10:09 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