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

Đề tài: Tại sao biến truyền vào hàm tạo sao chép phải là tham chiếu ?

  1. #1
    Ngày gia nhập
    09 2010
    Nơi ở
    Hà Nôi
    Bài viết
    464

    Mặc định Tại sao biến truyền vào hàm tạo sao chép phải là tham chiếu ?

    Các bạn cho mình hỏi tại sao hàm tạo sao chép (copy constructor) lại có dạng vd:
    Node(const Node &nn);
    Tại sao biến truyền vào phải là tham chiếu ????????????

  2. #2
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Mục đích là để truy xuất cho nó nhanh.
    Truyền theo trị như bình thường cũng dc nhưng chậm
    Um Mani Padme Hum...!!

  3. #3
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    trước hết bạn phải hiểu cách truyền biến kiểu class bằng tham chiếu và không tham chiếu,
    xem ví dụ:

    Visual C++ Code:
    1. #include <iostream>
    2.  
    3. using namespace std;
    4.  
    5. class CA
    6. {
    7. public:
    8.     CA()
    9.     {
    10.         cout << "Ham tao khong doi" << endl;
    11.     }
    12.  
    13.     CA(CA &a)
    14.     {
    15.         cout << "Ham tao sao chep" << endl;
    16.     }
    17.  
    18. };
    19.  
    20. void HamKoThamChieu(CA a)
    21. {
    22.     cout << "_____________" << endl;
    23. }
    24.  
    25. int _tmain(int argc, _TCHAR* argv[])
    26. {
    27.     CA a;
    28.     HamKoThamChieu(a);
    29.     return 0; //<- đặt breakpoint ở đây
    30. }

    output:
    ham tao khong doi
    ham tao sao chep
    ____________

    rút ra kết luận: trước khi gọi hàm, hàm tạo sao chép được gọi để sao chép giá trị tham số rồi truyền vào hàm.
    còn nếu truyền tham biến thì khỏi phải thử, không gọi hàm tạo sao chép đâu.

    nếu truyền một biến cho hàm tạo sao chép thì phải gọi hàm tạo sao chép để sao chép biết chuyền vào,
    và tiếp tục lại phải gọi hàm tạo sao chép để truyền vào cho hàm tạo sao chép,... cử lòng vòng luẩn quẩn như vậy đến hết đời.

    đó là cái dở của không truyền tham chiếu.

  4. #4
    Ngày gia nhập
    11 2010
    Nơi ở
    hell
    Bài viết
    165

    tìm hiu cách truyền tham chiếu tham trị rồi hàm copy là sẽ hiểu thôi
    HT117-5277

  5. #5
    Ngày gia nhập
    09 2010
    Nơi ở
    Hà Nôi
    Bài viết
    464

    Trích dẫn Nguyên bản được gửi bởi pkthanh92 Xem bài viết
    trước hết bạn phải hiểu cách truyền biến kiểu class bằng tham chiếu và không tham chiếu,
    xem ví dụ:

    Visual C++ Code:
    1. #include <iostream>
    2.  
    3. using namespace std;
    4.  
    5. class CA
    6. {
    7. public:
    8.     CA()
    9.     {
    10.         cout << "Ham tao khong doi" << endl;
    11.     }
    12.  
    13.     CA(CA &a)
    14.     {
    15.         cout << "Ham tao sao chep" << endl;
    16.     }
    17.  
    18. };
    19.  
    20. void HamKoThamChieu(CA a)
    21. {
    22.     cout << "_____________" << endl;
    23. }
    24.  
    25. int _tmain(int argc, _TCHAR* argv[])
    26. {
    27.     CA a;
    28.     HamKoThamChieu(a);
    29.     return 0; //<- đặt breakpoint ở đây
    30. }

    output:
    ham tao khong doi
    ham tao sao chep
    ____________

    rút ra kết luận: trước khi gọi hàm, hàm tạo sao chép được gọi để sao chép giá trị tham số rồi truyền vào hàm.
    còn nếu truyền tham biến thì khỏi phải thử, không gọi hàm tạo sao chép đâu.

    nếu truyền một biến cho hàm tạo sao chép thì phải gọi hàm tạo sao chép để sao chép biết chuyền vào,
    và tiếp tục lại phải gọi hàm tạo sao chép để truyền vào cho hàm tạo sao chép,... cử lòng vòng luẩn quẩn như vậy đến hết đời.

    đó là cái dở của không truyền tham chiếu.
    Thank !
    Ah cho mình hỏi nếu ko viết hàm tạo sao chép thì C++ có sẵn 1 hàm tạo sao chép mặc định rồi.
    Nhưng nếu code hàm tạo sao chép như bạn:
    C++ Code:
    1. CA(CA &a)
    2.     {
    3.         cout << "Ham tao sao chep" << endl;
    4.     }
    thì hàm tạo này có làm đúng dc nhiêm vụ ko ( sao chép ấy)

  6. #6
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    Mặc định Tại sao biến truyền vào hàm tạo sao chép phải là tham chiếu ?

    câu trả lời là không.

    code chứng minh:

    Visual C++ Code:
    1. #include <iostream>
    2.  
    3. using namespace std;
    4.  
    5. class CA
    6. {
    7. public:
    8.     int num;
    9.     CA()
    10.     {
    11.         num = 0;
    12.         cout << "Ham tao khong doi" << endl;
    13.     }
    14.  
    15.     CA(CA &a)
    16.     {
    17.         cout << "Ham tao sao chep" << endl;
    18.     }
    19.  
    20. };
    21.  
    22. void HamKoThamChieu(CA a)
    23. {
    24.     cout << a.num << endl;
    25.     cout << "_____________" << endl;
    26. }
    27.  
    28. int _tmain(int argc, _TCHAR* argv[])
    29. {
    30.     CA a;
    31.     HamKoThamChieu(a);
    32.     return 0;
    33. }

    output:
    Ham tao khong doi
    Ham tao sao chep
    1344335176
    _____________

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

    Thank bạn pkthanh92 nha.
    Đã được chỉnh sửa lần cuối bởi trongtamvoi : 18-09-2012 lúc 12:14 AM.

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

  1. 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
  2. Thuộc tính khóa ngoài( tham chiếu) biến mất khi biến đổi từ file XML sang DataTable
    Gửi bởi itmanhieu trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 17-08-2011, 08:02 PM
  3. Về vấn đề truyền con trỏ vào hàm (hay là truyền tham chiếu)
    Gửi bởi hieupm.it90 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 09-09-2010, 04:08 PM
  4. Kỹ thuật C Cách truyền tham chiếu là mảng cho hàm
    Gửi bởi conrongchautien 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: 28-04-2010, 11:09 PM
  5. Thắc mắc về truyền tham biến và tham trị .. và còn nữa ^^
    Gửi bởi without_you trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 9
    Bài viết cuối: 04-02-2010, 08:46 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