Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: [ Solved ]Tham chiếu hàm ! Sự khác biệt là j ?

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

    Mặc định [ Solved ]Tham chiếu hàm ! Sự khác biệt là j ?

    Trong cài đặt phép gán của C++ , mình đọc nhiều sách thì đa số dùng là tham chiếu khi viết hàm. Như ví dụ này
    Code:
    complex& operator=(const complex &b)
    		real=b.real;
    		img=b.img;		
    		return (*this);	
    }
    Tại sao phải viết như thế này vậy ? Mình suy nghĩ hoài mà không hiểu , mình không thêm dấu tham chiếu thì vẫn chạy bình thường ? mình nghĩ là dấu & để trả về chính đối tượng đó ! nhưng mà return *this; đã trả về chính đối tượng đó mà rồi mà ! Mình debug xem địa chỉ vùng nhớ của trỏ *this và đối tượng sau khi gán xong thì cũng thấy cùng địa chỉ ( dù có thêm & trước hàm hay không ) ? vậy mục đích complex& để làm j vậy ??

    Còn nữa . sao phải dùng const vậy ? phép gán đâu yêu cầu mình không đc thay đổi dữ liệu của đối tượng b ( bằng chứng là bò const vẫn run đc ) như copy contructor đâu ?Còn dấu &b thì mình biết vì sao gòi

    Mình hơi thắc mắc về cú pháp 1 chút , mình mún biết vì sao phải làm như vậy , mún biết mình viết như vậy để làm cái j . thắc mắc cũng lâu gòi mà chưa dám hỏi ai . hiz hiz .ai bít thì chì giúp mình với nha !
    Xin cám ơn trước
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

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

    complex& operator
    Trả về tham chiếu tới đối tượng cậu à !
    vậy mục đích complex& để làm j vậy ??
    Nếu không có tham chiếu :
    C++ Code:
    1. a = b; //ok
    2. a = b = c;// không tác dụng
    Ở đây giả sử a, b, c đều là complex.
    Còn nữa . sao phải dùng const vậy ? phép gán đâu yêu cầu mình không đc thay đổi dữ liệu của đối tượng b ( bằng chứng là bò const vẫn run đc ) như copy contructor đâu ?Còn dấu &b thì mình biết vì sao gòi
    Thằng bên trái toán tử là thằng gọi hàm, còn thằng bên phải cậu có chỉnh sữa gì của nó không ?
    C++ Code:
    1. complex& operator = (const complex& thằng_bên_phải)
    2. ....
    3. complex thằng_bên_trái;
    4. complex thằng_bên_phải;
    5. thằng_bên_trái = thằng_bên_phải
    6. tương đương với :
    7. thằng_bên_trái.operator = (const complex& thằng_bên_phải);
    [/quote] Mình hơi thắc mắc về cú pháp 1 chút , mình mún biết vì sao phải làm như vậy , mún biết mình viết như vậy để làm cái j . thắc mắc cũng lâu gòi mà chưa dám hỏi ai . hiz hiz .ai bít thì chì giúp mình với nha ! [/quote] Tui ở đây mỗi ngày, có thắc mắc gì hỏi T_T, ngại gì có phải con gái đâu nào .
    Cái kĩ thuật = = = là cascading, tìm các bài viết của tui tui có giải thích kĩ càng phần đó cho 1 cậu cách đây 1 tuần thì phải. Hay tìm trong box C++ (phần BT hay Hỏi đáp gì đó ). H tui nhác giải thích lại quá T_T !

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

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    Trả về tham chiếu tới đối tượng cậu à !

    Nếu không có tham chiếu :
    C++ Code:
    1. a = b; //ok
    2. a = b = c;// không tác dụng
    Ở đây giả sử a, b, c đều là complex.
    Mình run thử 2 trường hợp ( có & và không có &) thì vẫn chạy ok mà _T
    đầu tiên sẽ là b.operator=(c), trả về thằng b, gòi chạy a.operator=(b.operator=(c));. Tui nghĩ sẽ chạy như vậy đấy
    Vậy tác dụng của tham chiếu là j bạn _T ? không phải là khi mình thay đổi đối tượng *this gòi trã về *this là tự tham chiếu sao ?? Vẫn chưa thông chỗ này bạn àh ??

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    Tui ở đây mỗi ngày, có thắc mắc gì hỏi T_T, ngại gì có phải con gái đâu nào .
    nói thế oan tui wá ! Nào có mắc cỡ j đâu T_T ! Chỉ là hỏi mí ngừoi mà giải thik hoài tui ko hiểu ! Cứ hỏi vần lân thì làm fiền với lại wê lắm ! biết bạn Rox_rook
    online thường xuyên nên mới lên đây hỏi nè ^^

    Àh mà hỏi tiếp nha trong cái số phức ấy đấy
    Code:
    complex& operator = (const complex& thằng_bên_phải)
    mình không cần & cũng vẫn ok đúng không vậy bạn ?
    Code:
    complex& operator = (const complex thằng_bên_phải)
    nếu không có tham chiếu thì C++ sẽ gọi copy constructor tạo complex giống y cái tham số đầu vào gòi cúi cùng sẽ gán lại đúng không bạn ? không biết tui hiểu vậy đúng không ta ? Vậy nó sẽ nhanh hơn thoai hay còn có lợi ích j nữa ta ( khi mình đã có copy constructor khi dùng tham trị gòi ) ?

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

    không phải là khi mình thay đổi đối tượng *this gòi trã về *this là tự tham chiếu sao ?? Vẫn chưa thông chỗ này bạn àh ??
    Vậy check coi thử giá trị nó có thay đổi không ?
    ứ hỏi vần lân thì làm fiền với lại wê lắm ! biết bạn Rox_rook
    online thường xuyên nên mới lên đây hỏi nè ^^
    Có đầu óc nhí nhảnh T_T haha but it's cute .
    mình không cần & cũng vẫn ok đúng không vậy bạn ?
    Code:

    complex& operator = (const complex thằng_bên_phải)
    Nếu không có tham chiếu để const làm gì ? Truyền copy có chỉnh sữa được đối tượng đó đâu trong khi bù lại phải tạo 1 bản sao khủng bố ( nếu đối tượng có nhiều dữ liệu ), truyền tham chiếu ở đây chỉ là để thao tác trực tiếp trên dữ liệu đó + const và không được chỉnh sữa vè mặt ý nghĩa là hoàn toàn giống truyền bằng tham trị nhưng đối với 1 biến đơn ví dụ :
    C++ Code:
    1. void do_sthing(int a);
    Ok vì int dù gì chỉ là 4 byte.
    Bây h ví dụ :
    C++ Code:
    1. class BigStuff{
    2. private :
    3.  int a, b,c,d,e;
    4.  double arr[1000];
    5.  string[100];
    6. };
    sizeof(BigStuff) chắc tui nghĩ cũng phải vài chục byte. Bây h cậu có đủ can đảm truyền tham trị không hay const ref là giải pháp ?

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

    Mình cũng không hiểu ở chỗ này:
    Code:
    complex& operator=(const complex &b)
    		real=b.real;
    		img=b.img;		
    		return (*this);	
    }
    Mình không hiểu cái dấu & để làm gì.theo như mod nói thì trả về tham chiếu đến đối tưong nguồn nhưng mình không hiêu nguyên tắc hoạt động của nó,hổng lẽ chỉ cần thêm 1 cách máy móc vô như vậy phải có cách nào để mình hiểu nó chứ.Còn theo như mình nghĩ là khi trả về *this thì nó sẽ lấy thêm địa chỉ của *this có nghĩa là trả về địa chỉ của đối tưong nguôn luôn

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

    Mặc định [ Solved ]Tham chiếu hàm ! Sự khác biệt là j ?

    Mình không hiểu cái dấu & để làm gì.theo như mod nói thì trả về tham chiếu đến đối tưong nguồn nhưng mình không hiêu nguyên tắc hoạt động của nó,hổng lẽ chỉ cần thêm 1 cách máy móc vô như vậy phải có cách nào để mình hiểu nó chứ.Còn theo như mình nghĩ là khi trả về *this thì nó sẽ lấy thêm địa chỉ của *this có nghĩa là trả về địa chỉ của đối tưong nguôn luôn
    & là tham chiếu chứ không phải là & địa chỉ, dấu & có 2 ý nghĩa và trong TH này nó là tham chiếu đến đối tượng complex.
    this : là con trỏ đến complex.
    *this : khử tham chiếu con trỏ tui có complex.
    Vậy complex& là tham chiếu tới complex.
    Còn tại sao thì tui đã nói rùi :
    a = b = c. Đọc lại cho kĩ !
    C++ Code:
    1. return (*this);
    -> 2 dấu ngoặc ( ) chẳng có ý nghĩa gì ở đây cả, bỏ nó đi !

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

    Mình thử cái vd này gòi nè, nó sẽ cho thấy cái lỗi sai khi không tham chiếu :
    Code:
    complex a(55,66),b(88,99),c(1223.4563);
    cout<<(a=b)=c;
    cout<<a;
    Với lớp số complex lun ! Khi đó bỏ dấu & với để dấu & sẽ có sự khác nhau !
    Khi không có tham chiếu sẽ dẫn đến sai ! Vì sao ?
    (a=b)=c;
    khi đó b sẽ gán cho a và trả về a , tức là a phài là 88 (mình lấy ví dụ in ra phần thực)
    Sau đó gán c cho a, lúc đó a sẽ là 1223
    Nhưng khi in a ra thì chỉ bằng 88 ! <-- Sai

    Lí do là vì khi không có tham chiếu thì (a=b) không trả về a mà trã về 1 vùng nhớ khác ( mình thấy đc wa debug ) nên c gán cho (a=b) chứ không hề gán cho a !
    Lúc này phải tham chiếu đến đối tượng bị gán thì mới cho ra kết wả đúng ( là thêm dấu & vô )
    Cái này suy nghĩ gòi debug mất buổi tối mới ra ! hehe ! thanks rox_rook vì đã bỏ công giảng giải cho tui với bạn demontaihack nha ! Tui với bạn demontaihack đang học lập trình chung 1 lớp
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    Đã được chỉnh sửa lần cuối bởi ktwiz : 03-04-2008 lúc 05:29 PM. Lý do: đánh sai code

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

  1. Kiểu string trong c# là tham chiếu hay tham trị ???
    Gửi bởi thvnhn trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 11
    Bài viết cuối: 04-11-2013, 08:38 PM
  2. Bài tập C Bài tập tính lãi ngân hàng dùng đệ quy hoặc tham chiếu, tham trị
    Gửi bởi thaohoangf trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 08-10-2012, 08:24 AM
  3. Phân biệt truyền biến bằng tham trị, tham chiếu, địa chỉ. Xin cảm ơn.
    Gửi bởi thaoha trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 18-02-2012, 02:03 PM
  4. tham trị và tham chiếu trong C#
    Gửi bởi hunter1189 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 16
    Bài viết cuối: 03-04-2011, 11:03 PM
  5. Tham chiếu, con trỏ, tham trị có ý nghĩa gì?
    Gửi bởi alkill 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: 25-03-2011, 09:17 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