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

Đề tài: Một số vấn đề về chuyển kiểu (with user_define types)

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

    Mặc định Một số vấn đề về chuyển kiểu (with user_define types)

    Mình có một số thắc mắc rời rạc khi học về operator overloading và chuyển kiểu như sau:
    1/ Giả sử lớp A mình có 1 constructor chỉ với 1 tham số (convertion constructor) kiểu int A::A (int). khởi tạo này tạo 1 mảng độ dài là tham số truyền vào (toàn số 0)....
    Sau đó mình overload toán tử + cho 2 object của lớp A ghép 2 mảng số lại với nhau. Giả sử mình đã có 1 copy constructor. Khi đó mình test đoạn sau:
    object 4 = object1 + object2 + object3 + 5
    +/ Mình hiểu là số 5 ở đây sẽ được chuyển kiểu ngầm định về 1 mảng gồm 5 số 0 phải ko (vì mình đã có 1 convertion cóntructor ở trên rồi). Nhưng khi compile thì bị báo lỗi ?! Còn nếu để là :
    object1 = 5 thì ko có j (mặc dù cũng đã xảy ra chuyển kiểu ngầm định!)
    +/ Ngoài ra, nếu mình cho trị trả về của hàm overload của operator+ là const A & thì cũng bị lỗi runtime! Theo mình nghĩ là khi cộng các object ở vế phải nó sẽ trả về 1 tham chiếu tới 1 object tạm là tổng của các object. Nhưng khi ra khỏi scope thì object tạm này bị xóa nên ko thể truyền cho copy constructor dc phải ko vậy????? Lúc mình debug thì lúc mới vào copy construcor thì tham chiếu vẫn chỉ đúng giá trị tổng của vế phải nhưng khi f10 một lần thì tham chiếu lại thành NULL @.@
    +/ Còn nếu mình để trị trả về của operator+ là const A thì chạy bình thường nhưng mình lại có thắc mắc là liệu có phải như thế thì bộ nhớ sẽ ko hiệu quả hay không vì các kết quả của mỗi lần tính tổng sẽ là 1 object mới và ko có cách quản lí dc các object này!

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,749

    Mẫu cho việc xử lý sẽ ở dạng như sau:

    C++ Code:
    1. MyClass& operator+ (const int value)
    2. {
    3.     //Xử lý cộng đối tượng với một số ở đây
    4. }
    5.  
    6. MyClass& operator+ (const MyClass& obj)
    7. {
    8.     //Xử lý cộng đối tượng với đối tượng ở đây
    9. }

    Cứ thế áp vào ...

    PS: Viết rất dài, nhưng người khác khó hiểu hết...
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

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

    Trích dẫn Nguyên bản được gửi bởi Kevin Hoang Xem bài viết
    Mẫu cho việc xử lý sẽ ở dạng như sau:

    C++ Code:
    1. MyClass& operator+ (const int value)
    2. {
    3.     //Xử lý cộng đối tượng với một số ở đây
    4. }
    5.  
    6. MyClass& operator+ (const MyClass& obj)
    7. {
    8.     //Xử lý cộng đối tượng với đối tượng ở đây
    9. }

    Cứ thế áp vào ...

    PS: Viết rất dài, nhưng người khác khó hiểu hết...
    Cái này thì biết rồi, chủ yếu đang hỏi về cái implicit với explicit convertion kìa. Vậy theo bạn thì biểu thức:
    object3 = object1 + 5. Nó sẽ được thực hiện như thế nào!!
    Theo mình nghĩ thì khi gặp số 5 nó sẽ chuyển nó cho cái convertion constructor (tức cái hàm khởi tạo 1 thông số), sau đó đưa về 1 object mới và thực hiện phép cộng. Sau rồi ép vô cái copy constructor. Ko bit có đúng ko (hok biết dịch từ sách ra có sai ko nữa @.@)
    Đã được chỉnh sửa lần cuối bởi Fredy : 25-07-2011 lúc 11:11 PM.

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

    Rất xin lỗi lão đại Kevin nhưng mẫu của bạn bị sai. Mẫu của bạn là mẫu cho operator +=, còn operator + thì phải return 1 biến trung gian tức là kiểu A chứ không phải A&
    (hoặc trả về 1 expression template, nhưng cái đó là nâng cao chưa nhắc ở đây)
    Ngoài ra nếu đã có constructor A::A(int) thì không cần operator+ cho kiểu int nữa.

    Bạn chủ topic khai báo như sau:
    C++ Code:
    1. A& A::operator+=(const A&) {...; return *this;}
    2. A operator+(const A& a1, const A& a2) {A a(a1); a += a2; return a;}
    Chú ý là phải khai báo operator+ dạng 2 tham số thì implicit conversion mới chuẩn. Bạn có thể viết a + 1 hoặc 1 + a nó đều tự convert được nếu có constructor A::A(int)

    khi gặp object4 = object1 + object2 + object3 + 5
    nó sẽ lần lượt gọi
    object1 + object2 (==> temp1);
    temp1 + object3 (==> temp2)
    temp2 + 5 (==>temp3) => 5 sẽ được implicit convert về A (bằng cách gọi constructor A(5)) rồi thực hiện phép cộng
    object4 = temp3 ==> Gọi A::operator= . Nếu bạn không định nghĩa operator= thì nó sẽ dùng operator= mặc định
    Bạn chú ý 2 cái sau là hoàn toàn khác nhau:
    C++ Code:
    1. A object4;
    2. object4 = temp3;

    C++ Code:
    1. A object4 = temp3;
    Cái đầu là default constructor rồi operator=, cái thứ 2 lại là copy constructor nhé

    Các toán tử 2 ngôi như + - * / ... trả về 1 đối tượng mới là đúng và là điều phải chấp nhận. Khi bạn viết object4 = object1 + object2 + object3 + 5 thì sẽ có tới 4 đối tượng trung gian được tạo ra (1 cái để implicit convert 5, 3 cái trung gian kết quả +). Tuy nhiên chi phí tạo đối tượng trung gian nhiều khi không lớn như bạn nghĩ đâu. Nếu class A của bạn có data size là 4, không có virtual thì việc tạo/hủy 1 đối tượng A trung gian có khi cũng chỉ tốn kém bằng tạo / hủy 1 biến int (tùy code của A)
    Bạn có thể tìm hiểu thêm về expression template để biết nếu muốn không phải tạo đối tượng trung gian thì phải làm thế nào (khá phức tạp đấy!!) Chính xác ra là không phải tạo đối tượng A trung gian, chứ vẫn phải tạo đối tượng kiểu khác, do vậy cách đó chỉ tiết kiệm khi đối tượng A lớn, chi phí copy constructor cao.
    Đã được chỉnh sửa lần cuối bởi fbchicken : 26-07-2011 lúc 01:19 AM.

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

  1. Lỗi complie :[Warning] conflicting types for 'nhap'
    Gửi bởi boydamtac199 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: 07-12-2013, 11:21 PM
  2. Cách set Files of types khi load ảnh ?
    Gửi bởi Yuukan3101 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 7
    Bài viết cuối: 15-12-2011, 11:12 AM
  3. Types vs members
    Gửi bởi vietdev trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 0
    Bài viết cuối: 08-10-2011, 11:46 AM
  4. thư viện sys/types.h,sys/shm.h Ubuntu 10.10 ?
    Gửi bởi trần trân trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 6
    Bài viết cuối: 06-06-2011, 04:55 PM
  5. [VC6]invalid Types table in module obj\i386\shguid.obj
    Gửi bởi hoanglinh9466 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 9
    Bài viết cuối: 22-07-2007, 07:36 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