Đề 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

