Đề tài Trình bày điểm giống và khác nhau giữa C++, C# và Java ở vấn đề chú thích, hằng, kiểu dữ liệu, kiểm tra kiểu, đổi kiểu, không gian tên, quản lý và cấp phát bộ
Cả C++,C#sửdụng hai loạichú thích, riêng Javasửdụng ba loại:
- Chú thích dòng: dùng “//” ể đánhdấumột dòng là chú thích.
Khi đó, khi biêndịch thì trình biêndịchsẽbỏ qua những gì
viết ằng sau “//” cho ếnhết dòng. Loại chú thích này được
sửdụng giải thích cho những gì mà dònglệnh hiện hành hoặc
dònglệnhkế tiếpsẽ thực hiện (thường là những chú thích
ngắn).
- Chú thích đoạn (chỉ ởC++, Java): dùngcặp “/* */” ể đánh
dấumột đoạn là chú thích. Khi đó, trình biêndịchcũngsẽbỏ
qua những gì được viết giữa chúng (dùng cho những đoạn
chú thích).
-
BÀI THU HOẠCH SỐ 1 v Đề bài: Trình bày điểm giống và khác nhau giữa C++, C# và Java ở các vấn đề sau: chú thích, hằng, kiểu dữ liêu, kiểm tra kiểu, đổi kiểu, không gian tên, quản lý và cấp phát bộ nhớ, hàm trùng tên, nhập xuất. Sau đó có thể đưa ra nhận xét. Bài làm: 1. Chú thích: Cả C++, C# sử dụng hai loại chú thích, riêng Java sử dụng ba loại: - Chú thích dòng: dùng “//” để đánh dấu một dòng là chú thích. Khi đó, khi biên dịch thì trình biên dịch sẽ bỏ qua những gì viết đằng sau “//” cho đến hết dòng. Loại chú thích này được sử dụng giải thích cho những gì mà dòng lệnh hiện hành hoặc dòng lệnh kế tiếp sẽ thực hiện (thường là những chú thích ngắn). - Chú thích đoạn (chỉ ở C++, Java): dùng cặp “/*…*/” để đánh dấu một đoạn là chú thích. Khi đó, trình biên dịch cũng sẽ bỏ qua những gì được viết giữa chúng (dùng cho những đoạn chú thích). - Chú thích XML (chỉ ở C#): dùng “///” cho từng dòng chú thích. Chú thích XML ghi chép tài liệu cho một lớp hoặc một phương thức bằng cách sử dụng một phần XML (thường dùng để ghi chép mục đích chung nhất của một lớp hoặc một phương thức). - Chú thích HTLM (chỉ ở Java): dùng cặp “/**…*/” để đặt các chú thích vào những chỗ thích hợp (trước phần định nghĩa các lớp, interface, phương thức và biến) để trình javadoc có thể đọc và sử dụng để tạo ra tư liệu HTML cho chương trình. 2. Hằng: · Trong C++ biến hằng được định nghĩa bằng hai cách, có thể dùng từ khóa const hoặc dùng chỉ thị #define. -Với từ khóa const: biến hằng này sẽ được cấp phát một vùng nhớ trên vùng nhớ dữ liệu của chương trình, biến hằng phải được khởi gán khi khai báo, sẽ tồn tại trong suốt chương trình (vì thực chất biến hằng là một biến static) và không được phép thay đổi giá trị. -Với chỉ thị #define: khi biên dịch gặp chỉ thị này trình biên dịch sẽ thay tên hằng được định nghĩa thành giá trị của nó rồi mới biên dịch. · Trong C# biến hằng cũng được định nghĩa bằng hai cách với từ khóa const hoặc readonly. -Với từ khóa const: (tương tự như chỉ thị #define trong C++) khi gặp từ khóa này trình biên dịch sẽ thay biến hằng được định nghĩa thành giá trị rồi mới biên dịch. -Với từ khóa readonly: là một điều hoàn toàn mới, từ khóa này báo cho trình biên dịch biết đây là một biến chỉ đọc, không thể thay đổi giá trị nhưng có thể gán bằng giá trị của một biến khác khi khai báo (tức là mỗi lần thực thi giá trị của biến hằng có thể thay đổi nhưng trong quá trình thực thi ta không thể thay đổi giá trị). · Trong Java: chỉ sử dụng duy nhất từ khóa static final để định nghĩa biến hằng và trình biên dịch sẽ ngăn ngừa bất kỳ các đối tượng khác thay đổi giá trị của biến. 3. Kiểu dữ liệu: Kiểu dữ liệu trong C++, C# và Java được chia làm hai tập hợp kiểu dữ liệu chính: kiểu xây dựng sẵn mà ngôn ngữ cung cấp cho lập trình viên và kiểu được người dùng định nghĩa do lập trình viên tạo ra. a. Các kiểu dữ liệu xây dựng sẵn: -C++: unsigned char, char, enum, unsigned int, short int, int, unsigned long, long, float, double, long double. -C#: byte, char, bool, sbyte, short, ushort, int, uint, float, double, demical, long, ulong. -Java: char, byte, short, int, long, float, double. *Trong C++ và Java các kiểu dữ liệu này là các kiểu cơ bản không phải là các lớp, còn C# thì ngược lại các kiểu này là các lớp được thừa kế từ các lớp tương ứng trong .NET nên chúng có phương thức. *Cả ba ngôn ngữ thì kiểu dữ liệu này đều là kiểu giá trị mặc dù các kiểu này trong C# là các lớp. b. Các kiểu dữ liệu được người dùng định nghĩa: -Struct: chỉ có ở C++ và C#. -Class: có ở cả C++, C# và Java. *Trong C# và Java, kiểu dữ liệu này là kiểu tham chiếu trừ struct trong C#, còn C++ vẫn là kiểu giá trị. 4. Kiểm tra kiểu, đổi kiểu: a) Kiểm tra kiểu: -Trong C++ ta có thể lấy tên kiểu của một đối tượng hoặc một biến bằng phương thức: typeid(object).name() được định nghĩa trong file tiêu đề typeinfo.h (object là đối tượng hoặc biến muốn kiểm tra). Ví dụ: #include #include using namespace std; class A{}; int main() { int a; A b; cout<<typeid(a).name()<<”\n”<<typeid(b).name(); return 0; } Ø Kết quả : int class A -Trong C# ta có thể dùng toán tử is để kiểm tra kiểu của một đối tượng : Object is TypeObject. Trong đó Object là đối tượng, còn TypeObject là tên kiểu dữ liệu, giá trị trả về là true nếu Object là đối tượng của TypeObject hoặc dẫn xuất từ TypeObject và trả về false nếu ngược lại. -Trong Java ta dùng toán tử instanceof để kiểm tra kiểu của một đối tượng: Object instanceof TypeObject. Giá trị trả về là true nếu Object là đối tượng của TypeObject và trả về false nếu ngược lại. b) Đổi kiểu: Trong cả C++, C# và Java, các đối tượng thuộc một kiểu dữ liệu có thể chuyển đổi sang một kiểu dữ liệu khác qua cơ chế chuyển đổi tường minh hoặc chuyển đổi ngầm định. Việc chuyển đổi tường minh là do lập trình viên quyết định, còn việc chuyển đổi ngầm định được thực hiện tự động và phải đảm bảo không mất thông tin (tức là một kiểu có kích thước nhỏ có thể được chuyển kiểu ngầm định sang một kiểu có kích thước lớn còn ngược lại là không thể được). *Chuyển đổi tường minh: Cả C++, C# và Java đều sử dụng toán tử chuyển đổi kiểu để ép kiểu một đối tượng hoặc một biến, toán tử có dạng (typedata)object hoặc typedata(object), trong đó typedata là kiểu cần chuyển sang và object là đối tượng. Ngoài ra, trong C# và Java còn có cách chuyển kiểu tường minh bằng phương thức (vì tất cả các kiểu dữ liệu của C# và Java đều là đối tượng, ngoại trừ các kiểu dữ liệu cơ bản của Java). Nhưng vì các kiểu dữ liệu cơ bản của Java cũng được ánh xạ (map) qua các lớp bọc nên chúng vẫn có phương thức. *Chuyển đổi ngầm định: Việc chuyển kiểu ngầm định được thực hiện tự động khi trong biểu thức không có sự tương ứng kiểu. Một kiểu thấp có thể chuyển sang một kiểu cao hơn nhưng ngược lại là không thể được. -Trong C++: char->int->long->float->double -Trong C# và Java: byte->short->int->long->float->double 5. Không gian tên: -Không gian tên trong C++ và C# giống hệt nhau. Để tạo namespace ta dùng: namespace { // Các class } Để sử dụng một namespace ta dùng: using namespace ; // trong C++ using ; // trong C# -Trong Java không có khái niệm không gian tên nhưng khái niệm tương tự nó là package, mọi class trong Java đều chứa trong một package. Để tạo một package ta dùng: package ; Để sử dụng một package ta dùng: import ; 6. Quản lý và cấp phát bộ nhớ: -Trong C++, lập trình viên toàn quyền quyết định việc quản lý và cấp phát bộ nhớ. Những đối tượng được cấp phát động trong vùng nhớ Heap qua toán tử new phải được hủy một cách tường minh bởi lập trình viên qua toán tử delete. Việc quản lý và cấp phát được thông qua bởi một con trỏ. -Còn đối với C# và Java, việc quản lý và cấp phát bộ nhớ có một cơ chế riêng, an toàn hơn. Đó là cơ chế thu gom rác garbage collection, khi máy rảnh hoặc khi có yêu cầu cấp phát bộ nhớ mà bộ nhớ “không còn đủ” tiến trình thu gom rác sẽ được gọi một cách tự động bởi hệ thống. Cơ chế này sẽ tìm trong vùng nhớ những đối tượng nào không còn được sử dụng và sẽ thu lại vùng nhớ mà đối tượng đó chiếm giữ để cấp phát cho đối tượng khác, thỉnh thoảng trình này còn di chuyển vị trí các đối tượng trong vùng nhớ để chống phân mảnh vùng nhớ (tối ưu bộ nhớ). Việc quản lý và cấp phát được thông qua một tham biến đến đối tượng. -Nhưng khác với Java, việc quản lý và cấp phát bộ nhớ trong C# có thể được quản lý bởi lập trình viên, được gọi một cách tường minh và được thông qua bởi một con trỏ trong C#. Muốn sử dụng được con trỏ, khối lệnh có con trỏ phải được đặt trong khối unsafe{ …} và phải có từ khóa fixed trước khai báo biến con trỏ để báo cho trình thu gom biết không được di chuyển vị trí của đối tượng do con trỏ này trỏ đến. =>quản lý và cấp phát bộ nhớ trong C# và Java an toàn và tiện lợi hơn C++. 7. Hàm trùng tên: Trong C++, C# và Java đều cho phép hàm trùng tên qua cơ chế nạp chồng. Cơ chế này cho phép nhiều hàm có cùng một tên gọi nhưng số lượng các tham số, kiểu của các tham số phải khác nhau (kiểu trả về có thể giống nhau). Và cách định nghĩa lại một hàm trùng tên của chúng đều giống nhau. Ví dụ: Trong C++ ta có thể có định nghĩa các hàm: int SoSanh(int, int); int SoSanh(long, long); int SoSanh(char*, char*); int SoSanh(int, int, int); Khi ta gọi một hàm trong số các hàm trùng tên, trình biên dịch sẽ lựa chọn hàm nào tùy thuộc vào số lượng đối số, kiểu của các đối số mà ta truyền vào hàm. Ngoài ra, trong C# và Java không có tham số mặc định như trong C++. 7. Nhập xuất: -Trong C++, quá trình nhập xuất được xử lý bởi các dòng nhập (istream) và các dòng xuất (ostream) chuẩn thông qua bộ đệm. -Trong C# và Java, quá trình nhập xuất được xử lý bởi các luồng xuất, nhập hệ thống thông qua các đối tượng nhập xuất.
File đính kèm:
- Đề tài Trình bày điểm giống và khác nhau giữa C++, C# và Java ở vấn đề chú thích, hằng, kiểu dữ liệu, kiểm tra kiểu, đổi kiểu, không gian tên, quản lý và cấp phát bộ .pdf