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 6 trên tổng số 6 kết quả

Đề tài: Method trả về tham chiếu là biến địa phương lúc chính xác lúc không chính xác?

  1. #1
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    467

    Mặc định Method trả về tham chiếu là biến địa phương lúc chính xác lúc không chính xác?

    Theo mình được biết thì nếu một hàm trả về tham chiếu thì tham chiếu phải trỏ đến biến mà nó tồn tại bên ngoài hàm, tức là đó là biến toàn cục, hay biến static, hay là field của class khi hàm là method, hay là tham số của hàm truyền theo kiểu tham chiếu. Nếu không nó sẽ trả về giá trị rác nào đó. Thế nhưng...
    Mình có code sau
    C++ Code:
    1. #include <iostream>
    2. using namespace std;
    3.  
    4. class cls
    5. {
    6. private:
    7.     int num;
    8. public:
    9.     cls(int num):num(num){}
    10.     cls& tang(int n)
    11.     {
    12.         cls temp=*this;//copy *this sang temp
    13.         num+=n;
    14.         return temp;//trả về biến địa phương temp
    15.     }
    16.     cls& operator++(int)
    17.     {
    18.         return tang(1);
    19.     }
    20.     void display(ostream& ostr)
    21.     {
    22.         ostr<<"("<<num<<")";
    23.     }  
    24. };
    25. int main()
    26. {
    27.     cls obj(12);
    28.     obj.tang(3);
    29.     (obj++).display(cout);//kết quả chính xác
    30.     obj.tang(5).display(cout);//giá trị rác
    31.     obj.display(cout);//chính xác
    32. }
    33. /*kết quả là
    34. (15)(-545518272)(21)
    35. */
    Không biết operator++(int) có luôn luôn chính xác như vậy không? và trả về biến địa phương chỉ đúng với operator++(int) chăng?
    Mà mình nghĩ là nếu như vậy lại càng hay.
    Ps: mấy ngày trước nhớ có cái topic hỏi về operator++ với operator++(int) chừ biến đâu mất
    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
    07 2011
    Bài viết
    474

    trả về tham chiếu tới biến local là sai. Biến local sau khi hàm kết thúc thì nó cũng được dọn dẹp còn đâu mà tham chiếu tới. Y như mượn nhà rồi trả nhà rồi mà vẫn ở lì. Lúc thì chủ nhà để yên, lúc nó xách mã tấu tới chém.

  3. #3
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    467

    Vì thế mình mới hỏi tại sao operator++(int) trả về giá trị đúng, mặc dù mình không biết có luôn luôn đúng hay không?

    - - - Nội dung đã được cập nhật ngày 20-11-2019 lúc 01:52 PM - - -

    Chắc là INPT nói đúng
    Trên mạng cũng không có ai code là "T& operator++(int)" cả, mà tất cả đều là "T operator++(int)"
    Như vậy là không thể code class T sao cho
    Code:
    T t;
    (t++).method();
    được rồi
    Còn operator chạy xong thì temp thành rác, nhưng do chưa có gì mới nên đống rác cũ chưa được dọn dẹp, kết quả là giá trị cũ tính được bên trong hàm operator vẫn còn

    - - - Nội dung đã được cập nhật ngày 20-11-2019 lúc 08:21 PM - - -

    Trích dẫn Nguyên bản được gửi bởi khoaph Xem bài viết
    Ps: mấy ngày trước nhớ có cái topic hỏi về operator++ với operator++(int) chừ biến đâu mất
    Tìm ra rồi._____________________
    Đã được chỉnh sửa lần cuối bởi khoaph : 20-11-2019 lúc 02:29 PM.

  4. #4
    Ngày gia nhập
    07 2011
    Bài viết
    474

    mới học C++ hay sao mà ko dám "return *this;"

  5. #5
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    467

    Trích dẫn Nguyên bản được gửi bởi INTP Xem bài viết
    mới học C++ hay sao mà ko dám "return *this;"
    Code này sai
    C++ Code:
    1. Select All | Show/Hide
    2. #include <iostream>
    3. using namespace std;
    4.  
    5. class cls
    6. {
    7. private:
    8.     int num;
    9. public:
    10.     cls(int num):num(num){}
    11.     cls& tang(int n)
    12.     {
    13.         cls temp=*this;//copy *this sang temp
    14.         num+=n;
    15.         return temp;//trả về biến địa phương temp
    16.     }
    17.     cls& operator++(int)
    18.     {
    19.         return tang(1);
    20.     }
    21.     void display(ostream& ostr)
    22.     {
    23.         ostr<<"("<<num<<")";
    24.     }  
    25. };
    26. int main()
    27. {
    28.     cls obj(12);//num=12
    29.     obj.tang(3);//num =15
    30.     (obj++).display(cout);//mình muốn nó in ra 15, còn num=16
    31.     obj.tang(5).display(cout);//mình muốn nó in ra 16, còn num =21
    32.     obj.display(cout);//in ra 21
    33. }
    Mình không thể return *this vì nó không đúng với mục đích của method của mình

  6. #6
    Ngày gia nhập
    07 2011
    Bài viết
    474

    Mặc định Method trả về tham chiếu là biến địa phương lúc chính xác lúc không chính xác?

    return *this trong hàm cls& tang(int n) ấy ~_~ cần gì phải tạo temp???

    operator++() trả về chính đối tượng gọi ++obj, sau khi đã thực hiện ++
    operator++(int) trả về bản copy cũ của đối tượng gọi obj++, trước khi thực hiện ++

    edit: nhìn lộn hàm `tang` là `operator++`
    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 INTP : 21-11-2019 lúc 08:16 AM.

Tags của đề tài này

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