Đặng Trần Hiếu đã viết:
Vũ Thanh Điềm đã viết:
Đặng Trần Hiếu đã viết:
Thế "tự động overload cho mỗi class", cái này thì chưa chắc chắn được. Nếu em hiểu ko lầm thì ý anh ở đây là dựa vào đối số mà new sẽ cung cấp bộ nhớ tương đương, ví dụ như new int & new float. Tuy nhiên nếu là hàm thì nó vẫn có thể dựa vào đối số rùi dùng sizeof để cấp phát bộ nhớ tương đương cơ muh ---> theo cách lý giải của anh, chẳng có lý do gì để nó là language-level construct cả.
Có thể anh không hoàn toàn chính xác về "tự động overload", nhưng chắc chắn là có sự "can thiệp" của compiler cho new (thêm phần code để gọi constructor và cast to the right type). Còn malloc là fixed code, nằm trong một cái dll nào đớ, và compiler chỉ việc link đến thôi.
sizeof ko phải là "hàm", nó là 1 operator.
Anh không để ý lắm về từ ngữ
, nhưng nói cho cùng thì operator cũng chỉ là một dạng function.
Tất nhiên là language-level construct thì phải khác với library function rùi. Nhưng mà ý em là nếu ko phải vì new nhận 1 kiểu làm đối số thì new hoàn toàn có thể là library function ---> có lẽ cách giải thích của anh ko được thuyết phục cho lém.
Còn operator thì khác hẳn với library function đấy. Nó giống với language-level construct hơn vì nó là thành phần cơ bản của ngôn ngữ, ko giống như library function, library function có thể có với compiler này nhưng lại ko có với compiler khác tùy vào nhà sản xuất compiler & library function phải include header có prototype của function đó mới dùng được, language-level construct thì ko vì nó là thành phần cơ bản của ngôn ngữ.
Chính vì thế nên em nghĩ là lý do new phải là language-level construct là vì function ko thể nhận 1 kiểu làm đối số, function chỉ có thể nhận 1 giá trị làm đối số. Dù seo đây cũng chỉ là phỏng đoán qua suy luận thui, chẳng có tài liệu chính thức nào cả nhưng dù seo thì nghe cũng có vẻ có lý. :-? :-?
Nhận kiểu làm đối số (heh, cụm từ này nghe hoành tráng phết nhấy,
) theo anh chỉ là một dạng ưu đãi đặc biệt cho new cũng như sizeof (mặc dù cho new, anh thấy nó giống như "pointer" to constructor hơn, vì em có thể dùng new int(10) etc). Nếu nhìn kỹ vào signature của new, em sẽ khá ngạc nhiên là nó hoàn toàn giống malloc:
void* operator new (size_t)
Thế nhưng khi new đựơc gọi, thì không chỉ có function này đựơc gọi mà cả constructor cũng được gọi. Phần code đó là do compiler nhét vào, dựa trên "sự hiểu biết về luât" của new trong C++.
Tuy nhiên bảo vì new là operator nên nó là language-level construct cũng có lý, vì đã là operator thì tất nhiên phải được "language" approve
. Tuy nhiên hầu hết các operator khác em có thể overload thoải mái, không chịu ràng buộc như new, và nhiều operator (như +, - etc) không tồn tại nếu em không define cho class của em).
Tóm lại, ý của anh là code cho new là code động, được compiler tạo ra dựa trên "bộ luật" về new, còn malloc là code tĩnh, trốn trong một thư viện nào đó.