Đề tài Nhận xét điểm giống và khác giữa C++ và C#, Java
- C++ làngôn ngữlập trình đượcphát triển trên nền tảngcủa C, ngôn ngữvốn đãrất
thuyếtphục nhàlập trình vàonhữngnăm70của thếkỉ 19.Năm 1980nhà khoahọc
ngườiMỹ B. Stroustrup đã cho ra đờingôn ngữ C có tên là “C cólớp”, đến năm
1983 đượcgọi là C++. Đây là ngôn ngữlập trìnhhướng đốitượng đầu tiên. C++ là
sữphát triểnmạnh mẽcủa C, khôngnhững được đưa vào những côngcụlập trình
hướng đốitượng chuyên nghiệp mà còn cónhững khảnăngmạnhmẽcủa hàm. C++
trở thành ngôn ngữlập trìnhhướng đốitượngnổibật trong nhữngnăm 90.
- Java làngôn ngữlập trình do Sun Microsystem giới thiệunăm 1995.Từ đó nó trở
thành côngcụlập hữu ích cho cácnhàlập trình chuyên nghiệp. Java đượcphát
triển trênnềncủa C và C++.Nó sửdụngcấu trúccủa C vàphương thứchướng đối
tượngcủa C++.
- C# thì được phát triểnvớisựkếthợp củacả haingôn ngữ trên. C# mangnhững đặc
điểmvềcấu trúccủa C++nhưng có phong cáchlập trình của Java (gói, garbage,
collection ).
, float -> 4 byte… Cũng như trong C#, java cũng có các kiểu dữ liệu tham chiếu gồm: Array, Class và Interface 4. Kiểu kiểm tra, đổi kiểu: - Nhìn chung kiểu dữ liệu rất quan trọng trong cả ba ngôn ngữ lập trình này. Các biến cần được khai báo một cách rõ rang. Ví dụ khi nhập xuất chúng ta không cần phải định nghĩa kiểu nhập xuất, chương trình sẽ tự hiểu theo kiểu dữ liệu đã được khai báo trước. Ví dụ: cin<<”a=”<<a; cout>>a>>b; - Trong C# và Java khi khai báo một biến cần chỉ rõ kiểu dữ liệu, Nó liên quan đến việc truy xuất cũng như cấp phát cùng nhớ. Đổi kiểu dữ liệu: gồm chuyển đổi tường minh và chuyển đổi ngầm. Có 3 cách để đổi kiểu dữ liệu tường minh: + (kiểu dữ liệu mới) +kiểu dữ liệu mới(Biểu thức) +sizeof(kiểu dữ liệu/biến)->Kích thước của kiểu dữ liệu hoặc biến. PDF created with pdfFactory Pro trial version www.pdffactory.com Chuyển đổi ngầm: chương trình tự chuyển đổi dữ liệu lên kiểu cao hơn trong các phép gán, giá trị trả về… 5. Không gian tên-Namespace: - Cách đặt tên biến nói chung tùy thuộc vào người dùng, không đặt trùng tên các từ khóa, tên hàm và tên class. - Trong các ngôn ngữ lập trình thường có rất nhiêu tên hàm, đây là một khó khăn cho người lập trình khi phải nhớ quá nhiều tên hàm. Ví dụ trong C, hay C++ ta có rất nhiều hàm: hàm nhập xuất, hàm định nghĩa lớp, cấu trúc, định nghĩa hằng…. - Vấn đề đặt ra là phải giúp người lập trình không phải nhớ nhiều và phải tra cứu nhanh. Điều này đã được khắc phục trong C#. Trong C# các tên hàm có liên hệ với nhau về chức năng được nhóm thành một vùng tên chung. Ví dụ: Stack,Queue,Hashtable -> thành một vùng Writeline, readline -> thành một vùng. Vì thế người lập trình chỉ cần nhớ các tên vùng chung. Việc truy xuất đến các hàm trong vùng theo cấu trúc: B.A.Ten_lop_trong_vung_ten_A // Trong đó A là tên vùng con trong B. Ví dụ: System.console.writeline(“Hello world!”); - Trong C#, các Namespace được cung cấp bởi thư viện MS.NET và hãng thứ ba cung cấp. Ngoài ra ta cũng có thể tự tạo ra các namespace. Để dùng một namespace : Using Để tạo một namespace : Namespace { ; ; ………… } Ví dụ: Tạo một namespace ChuoiSo: Namespace ChuoiSo { using System; public class Tester { public static int Main() { PDF created with pdfFactory Pro trial version www.pdffactory.com for (int i =0; i < 10; i++) { Console.WriteLine( “i: {0}”, i); } return 0; } } } Chú ý thêm : + Trong C# tên vùng System chứa hầu hết các tên vùng hữu ít cho ngượi lập trình như Console, Math,Exception… + Khi cân dùng nhiều lần các hàm trong cùng một tên vùng, ta có thể khai báo tên vùng đó trước với từ khóa Using (để không cần phải nhắc lại nhiều lần). Ví dụ: using system; using system.console;….. + Các namespace có thể được tạo lồng nhau. - Trong java thì các Namespace cũng được tổ chức tương tự như trong C#. 6. Quản lí, cấp phát vùng nhớ: - Trong C++: + Biến cố định đươc cấp phát vùng nhớ ngay khi khai báo với kích thước theo đúng với kiểu dữ liệu được khai báo. + Biến con trỏ: được cấp phát vùng nhớ với từ khóa new và sau đó phải được giải phóng bởi hàm delete. - Trong C#: + Nhìn chung các dữ liệu có kích thước lớn được lưu trữ trong vùng nhớ stack(kiểu dữ liệu tham chiếu…), có kiểu dữ liệu và kích thước lớn được lưu trữ trong vùng nhớ head. + Các biến trong C# được cáp phát vùng nhớ bằng từ khóa new, nhưng không cần giải phóng. Chương trình tự động hủy khi không dùng đến bằng bộ công cụ garbage collector ->không bao giờ quên giải phóng vùng nhớ. - Trong Java: + Cũng giống như trong C#, trong Java các biến được cấp phát vùng nhớ bằng từ khóa new (trong vùng nhớ head) và cũng không cần phải giải phóng. Java cung cấp cơ chế Garbage collection(GC) tự giải phóng đối tượng (không phải với mọi đối tượng) khi không cần thiết. + Cơ chế hoạt động của GC: Sử dụng cơ chế đếm? Mỗi đối tượng có một số đếm các tham chiếu PDF created with pdfFactory Pro trial version www.pdffactory.com trỏ tới và giải phóng đối tượng khi số đếm = 0. Giải phóng các đối tượng chết Kiểm tra tất cả các tham chiếu, đánh dấu các đối tượng còn được tham chiếu, giải phóng các đối tượng không được tham chiếu. 7. Hàm trùng tên: - Đây là điểm đặc biệt của C++.C++ cho phép chúng ta khai báo hai hàm trung tên, chúng chỉ cần khác nhau về số lượng các tham số,hay kiểu dữ liệu các tham số (thẩm chí là giá trị trả về). Ví dụ: #include Int add(int a, int b) { return (a+b); } Float add(float a, float b) { return (a+b); } Void main() { Int x=3,y=5,t; Float m=8.25,n=3.5,r; t=add(x,y); r=add(m,n);//hoàn toàn hợp lệ } =>Đây là một cải tiến đặc biệt trong C++ giúp người lập trình không cần phải tạo quá nhiều hàm khác nhau với những mục đích tương tự nhau. Điều này cũng giúp người lập trình cũng như người sử dụng dễ dàng gọi hàm khi dùng (không cần nhớ quá nhiều tên hàm). Ví dụ : + Hàm printf (….); scanf(…);//trong C ta có thể truyền bao nhiêu tham số cũng được. + Hàm cin>…; //trong C++. - Trong C# thi không có định nghĩa hàm trùng tên, Trong C# chỉ có định nghĩa nạp chồng.Chúng ta sẽ tìm hiểu sơ lượt về nạp chồng trong C#: + Ngôn ngữ C# có hướng thiết kế là các lớp do người lập trình tạo ra cũng có những tính năng như các lớp được định nghĩa sẵn. Khi chúng ta định nghĩa một lớp thi lớp đó phải có đầy đủ các chức năng như một lớp đã đuộc định nghĩa ,phải có đầy đủ các hoạt động và phải mang tính trực quan. Ví dụ: Để cộng hai phân số: + Trong C++: PhanSo Sum=Ps1.Add(Ps2);//Không mang tính trực quan + Trong C#: PhanSo Sum=Ps1+Ps2;//Trực quan, dể hiểu + Để làm được điều đó C# cung cấp từ khóa operator. Cú pháp: [phạm vi] operator (danh sách tham số); Trong dó phạm vi có thể là: private,public,static…. Trong ví dụ trên: public static PhanSo operator + (Ps1,Ps2); Khi đó trong chương trình khi gặp lệnh Ps1+Ps2 trình biên dịch tự động chuyển biểu thưc vào : PhanSo.operator+(Ps1,ps2). PDF created with pdfFactory Pro trial version www.pdffactory.com Kết quả: Sum=Ps1.Add(Ps2); -> Sum=Ps1+Ps2; - Trong Java cúng không có khái niêm hàm trùng tên.Trái lại Java cho phép ta xây dựng nhiều phương thức trùng tên nhau, trong cùng một lớp, hiện tượng các phương thức trong một lớp có tên giống nhau được gọi là bội tải phương thức. Để có thể dùng bội tải phương thức thì các phương thức trùng tên phải có đối số, hoăc kiểu dữ liệu khác nhau-> để chương trình biết gọi phương thức nào ->nếu không sẽ báo lỗi. Ví dụ: public class Overloading { static void print(String s, int i) { System.out.println( "String: " + s + ", int: " + i); } static void print(int i, String s) { System.out.println( "int: " + i + ", String: " + s); } public static void main(String[] args) { print("String first", 11); print(99, "Int first"); } } 8. Nhập xuất: - Toán tử “.” Trong C++ dùng để truy xuất tới các thành phần trong một class, struct. Trong C# và Java dùng để truy xuất tới các tên vùng con, thành phần trong vùng con…. - Trong C++: Hàm nhập xuất:trong C++ dùng hai hàm điển hình la cin và cout. Cú pháp: Hàm nhập: cin<<ten_bien ; Hàm xuất: cout>>ten_bien/chuoi/gia_tri… Khi muốn nhập hoặc xuất nhiều biến,chuỗi, gía trị… ta dùng lien tục các dấu “>” PDF created with pdfFactory Pro trial version www.pdffactory.com Ví dụ: cout>>”a=”>>a>>”\n”; cin<<a<<b; => trong C++ khi xuất với hàm cout ta không cần định dạng kiểu dữ liệu xuất. Hàm cout tự xác đình kiểu dữ liệu xuất theo kiểu đã được định nghĩa cho biến trước đó. Đây là một trong những điều chứng tỏ kiểu dữ liệu rất quan trọng trong C++. Ngoài ra hàm cin còn cho phép người dùng nhập một chuỗi kí tự từ bàn phím. - Trong C#, hàm truy xuất gồm hai hàm cơ bản là Write/WriteLine và Read/ReadLine. Các hàm trên nằm trong thư viện Console. Như đã nói ở trên, để có thể sử dụng một hàm cần phải khai báo các Vung chứa hàm(namespace) hoặc là dùng lời gọi với các vùng chứa hàm. Ví dụ: Chương trình xuất dòng chữ “Hello world!” Using System Namespace Xuat() { Public static int Main() { Console.WriteLine(“Hello World!”); } Return 1; } Hoặc: Namespace Xuat() { Public static int Main() { System.Console.WriteLine(“Hello World!”); } Return 1; } PDF created with pdfFactory Pro trial version www.pdffactory.com - Trong Java: cũng tương tự như trong C#, khi muốn truy xuất thì ta phải khai báo các Vùng chứa hàm. Chỉ khác về tên vùng và tên hàm. Trong java dùng Vùng System.out và System.in thay cho System.Console trong C#. Trong Java cũng có định nghĩa Luồng dữ liệu để trừu tượng hóa hướng nhập xuất dữ liệu. Luồng là sự trừu tượng hoá ở mức cao, do vậy bất kể dữ liệu được đọc vào từ đâu hoặc ghi ra đâu, thì thuật toán đọc/ghi tuần tự đều tựa như sau: Đọc vào open a stream while more information read information close the stream Ghi ra open a stream while more information write information close the stream · Lớp Luồng: Java đưa ra nhiều lớp luồng, để xử lý mọi loại dữ liệu, java chia luồng ra thanh 2 loại: luồng byte ( byte stream) và luồng kí tự (character stream), lớp InputStream và OutputStream là hai lớp cơ sở cho mọi luồng nhập xuất hướng byte, và lớp Reader/ Writer là hai lớp cơ sở cho việc đọc ghi hướng kí tự. Lớp RandomAccessFile kế thừa từ lớp Object và triển khai giao diện, InputStream và OutputStreafm, đây là lớp duy nhất hỗ trợ cả đọc lẫn ghi. Nhìn chung trong mõi ngôn ngữ lập trình đều có những thế mạnh của nó. Ngôn ngữ ra sau kế thừa và phát triển những ưu điểm vốn có của ngôn ngữ trươc. Điểm chung của chúng là luôn hướng đến phương thức lập trình hướng đối tượng vá giúp công việc lập trình ngày càng dễ dàng hơn. PDF created with pdfFactory Pro trial version www.pdffactory.com
File đính kèm:
- Đề tài Nhận xét điểm giống và khác giữa C++ và C#, Java.pdf