Sự khác nhau giữa C# và C++
2 posters
Trang 1 trong tổng số 1 trang
Sự khác nhau giữa C# và C++
Thừa kế: Trong C++, class và struct hầu như giống nhau, ngược lại trong C#, chúng khá khác nhau. Lớp C# có thể hiện thực/thừa kế (implement) nhiều interface, nhưng chỉ được thừa kế từ chỉ 1 lớp cơ sở. Hơn nữa, struct C# không hỗ trợ thừa kế, và không hỗ trợ constructor mặc định
Mảng (Array): Trong C++ mảng chính là 1 con trỏ (pointer). Trong C#, mảng là đối tượng (object),có thuộc tính và phương thức. Ví dụ, số phần tử của mảng có thể lấy thông qua thuộc tính Length. Mảng C# còn kiểm tra chỉ số thứ tự khi truy xuất phần tử. Cú pháp khai báo mảng trong C# và C++ cũng khác: token "[] " theo sau khai báo kiểu của mảng chứ không phải đứng sau tên biến như trong C++
Boolean: Trong C++, kiểu bool thực ra là số integer. Trong C#, không có sự tự chuyển đổi qua lại giữa bool và các kiểu khác
Kiểu số nguyên long: Trong C#, kiểu long có độ dài 64 bit, trong C++ là 32 bit.
Kiểu số nguyên int: Trong C#, nó chắc chắn có độ dài 32 bit, trong VC++ là 32 bit, trong các trình biên dịch C++ khác, độ dài của nó có thể là 16 bit.
Truyền tham số: Trong C++, mọi biến được truyền bằng trị,
nếu không phải là con trỏ hoặc biến tham khảo. Trong C#, đối tượng (một thực thể của class) được truyền tham khảo (truyền tham biến), struct được truyền tham trị, nếu không khai báo "ref" hoặc "out"
Phát biểu switch: Không giống C++, C# hỗ trợ việc nhảy từ nhãn này qua nhãn khác qua phát biểu goto
Delegate: Delegate C# giống như con trỏ hàm của C++, nhưng an toàn và bảo mật.
Phương thức trong lớp cha: C# hỗ trợ từ khóa "base" cho việc gọi lại các phương thức của lớp cha. Hàm nạp chồng (overload) được khai báo 1 cách tường minh bằng từ khóa "override"
Che khuất phương thức: Trong C++ phương thức trong lớp con chắc chắn che khuất phương thức trong lớp cha nếu chúng cùng prototype. Trong C#, bạn phải dùng từ khóa "new" trước phương thức hay thuộc tính bạn muốn che phủ
Chỉ thị tiền biên dịch: C# chỉ cho đặt dẫn hướng tiền biên dịch (là các symbol) trong configuration của project, mà không có các file header (.h)
Exception: C# cung cấp từ khóa "finally" cho đoạn code try {} catch để bắt Exception mà cần thêm những tác vụ bảo đảm an toàn
Toán tử: C# hỗ trợ một số toán tử mở rộng như: "is", "typeof".
Từ khóa "extern": Trong C++, "extern" dùng để khai báo kiểu/biến được định nghĩa trong file .obj khác. Trong C#, extern dùng để tạo ra một bí danh (alias) khi sử dụng version khác của 1 assembly.
Từ khóa "static": Trong C++, static dùng trong khai báo phương thức/thuộc tính/biến trong class, hàm. Trong C#, chỉ dùng đối với các thành viên của class, không có trong hàm
Hàm main: Trong C# hàm Main (M viết hoa) luôn khai báo là static
Con trỏ: Được phép trong C#, nhưng chỉ trong mode unsafe
Sự khác nhau ở các toán tử.
Chuỗi (string): Trong C++, string chỉ đơn giản là mảng ký tự. Trong C# string là 1 đối tượng (object) có hỗ trợ các phương thức tìm kiếm
Từ khóa foreach: Trong C#, cho phép duyệt qua các phần tử của mảng hoặc tập hợp
Tầm vực Toàn cục: Trong C#, biến phương thức không có tầm vực toàn cục, chúng bắt buộc phải thuộc 1 class/struct nào đó
Biến cục bộ: Trong C#, biến cục bộ có thể dùng trước khi khởi tạo giá trị
Quản lý bộ nhớ: C++ không có cơ chế dọn rác, bộ nhớ không được trả lại hệ thống cho đến khi process kết thúc hoặc tự giải phóng bằng phát biểu delete/free. C# làm một cách tự động
Hàm khởi tạo: Tương tự như C++, nếu bạn không viết hàm khởi tạo nào trong 1 lớp của C# thì 1 hàm khởi tạo mặc định tự động tạo ra (trong assembly) cho bạn. Hàm khởi tạo mặc định khởi tạo những giá trị mặc định cho các biến thành viên
Giá trị mặc định cho tham số hàm/phương thức: C# không có, bạn phải dùng cách nạp chồng phương thức để thực hiện
Kiểu generic: Khai báo như là một tham số của class hay method, tương tự như template trong C++
Từ khóa "as": toán tử chuyển đổi kiểu, sẽ ném một exception nếu việc chuyển đổi không thực hiện được. Giống với static_cast trong C++, nhưng khác với dynamic_cast vì dynamic_cast không thực hiện kiểm tra sự tươngthích kiểu nên không ném exception nào nếu như thực sự có lỗi
Mảng (Array): Trong C++ mảng chính là 1 con trỏ (pointer). Trong C#, mảng là đối tượng (object),có thuộc tính và phương thức. Ví dụ, số phần tử của mảng có thể lấy thông qua thuộc tính Length. Mảng C# còn kiểm tra chỉ số thứ tự khi truy xuất phần tử. Cú pháp khai báo mảng trong C# và C++ cũng khác: token "[] " theo sau khai báo kiểu của mảng chứ không phải đứng sau tên biến như trong C++
Boolean: Trong C++, kiểu bool thực ra là số integer. Trong C#, không có sự tự chuyển đổi qua lại giữa bool và các kiểu khác
Kiểu số nguyên long: Trong C#, kiểu long có độ dài 64 bit, trong C++ là 32 bit.
Kiểu số nguyên int: Trong C#, nó chắc chắn có độ dài 32 bit, trong VC++ là 32 bit, trong các trình biên dịch C++ khác, độ dài của nó có thể là 16 bit.
Truyền tham số: Trong C++, mọi biến được truyền bằng trị,
nếu không phải là con trỏ hoặc biến tham khảo. Trong C#, đối tượng (một thực thể của class) được truyền tham khảo (truyền tham biến), struct được truyền tham trị, nếu không khai báo "ref" hoặc "out"
Phát biểu switch: Không giống C++, C# hỗ trợ việc nhảy từ nhãn này qua nhãn khác qua phát biểu goto
Delegate: Delegate C# giống như con trỏ hàm của C++, nhưng an toàn và bảo mật.
Phương thức trong lớp cha: C# hỗ trợ từ khóa "base" cho việc gọi lại các phương thức của lớp cha. Hàm nạp chồng (overload) được khai báo 1 cách tường minh bằng từ khóa "override"
Che khuất phương thức: Trong C++ phương thức trong lớp con chắc chắn che khuất phương thức trong lớp cha nếu chúng cùng prototype. Trong C#, bạn phải dùng từ khóa "new" trước phương thức hay thuộc tính bạn muốn che phủ
Chỉ thị tiền biên dịch: C# chỉ cho đặt dẫn hướng tiền biên dịch (là các symbol) trong configuration của project, mà không có các file header (.h)
Exception: C# cung cấp từ khóa "finally" cho đoạn code try {} catch để bắt Exception mà cần thêm những tác vụ bảo đảm an toàn
Toán tử: C# hỗ trợ một số toán tử mở rộng như: "is", "typeof".
Từ khóa "extern": Trong C++, "extern" dùng để khai báo kiểu/biến được định nghĩa trong file .obj khác. Trong C#, extern dùng để tạo ra một bí danh (alias) khi sử dụng version khác của 1 assembly.
Từ khóa "static": Trong C++, static dùng trong khai báo phương thức/thuộc tính/biến trong class, hàm. Trong C#, chỉ dùng đối với các thành viên của class, không có trong hàm
Hàm main: Trong C# hàm Main (M viết hoa) luôn khai báo là static
Con trỏ: Được phép trong C#, nhưng chỉ trong mode unsafe
Sự khác nhau ở các toán tử.
Chuỗi (string): Trong C++, string chỉ đơn giản là mảng ký tự. Trong C# string là 1 đối tượng (object) có hỗ trợ các phương thức tìm kiếm
Từ khóa foreach: Trong C#, cho phép duyệt qua các phần tử của mảng hoặc tập hợp
Tầm vực Toàn cục: Trong C#, biến phương thức không có tầm vực toàn cục, chúng bắt buộc phải thuộc 1 class/struct nào đó
Biến cục bộ: Trong C#, biến cục bộ có thể dùng trước khi khởi tạo giá trị
Quản lý bộ nhớ: C++ không có cơ chế dọn rác, bộ nhớ không được trả lại hệ thống cho đến khi process kết thúc hoặc tự giải phóng bằng phát biểu delete/free. C# làm một cách tự động
Hàm khởi tạo: Tương tự như C++, nếu bạn không viết hàm khởi tạo nào trong 1 lớp của C# thì 1 hàm khởi tạo mặc định tự động tạo ra (trong assembly) cho bạn. Hàm khởi tạo mặc định khởi tạo những giá trị mặc định cho các biến thành viên
Giá trị mặc định cho tham số hàm/phương thức: C# không có, bạn phải dùng cách nạp chồng phương thức để thực hiện
Kiểu generic: Khai báo như là một tham số của class hay method, tương tự như template trong C++
Từ khóa "as": toán tử chuyển đổi kiểu, sẽ ném một exception nếu việc chuyển đổi không thực hiện được. Giống với static_cast trong C++, nhưng khác với dynamic_cast vì dynamic_cast không thực hiện kiểm tra sự tươngthích kiểu nên không ném exception nào nếu như thực sự có lỗi
Re: Sự khác nhau giữa C# và C++
Đúng rồi. Mình thử dòng này:
Và biên dịch không báo lỗi. Vậy cơ bản struc và class khác nhau chỗ nào?
#include <iostream.h>
struct A {
A()
{
cout<<"Hello";
}
};
struct B : A
{
B():A()
{
cout<<"Doi tuong beta ";
}
};
struct C : B { };
void main()
{
A a;
cout<<"\nTao doi tuong beta: ";
B b;
}
Và biên dịch không báo lỗi. Vậy cơ bản struc và class khác nhau chỗ nào?
Re: Sự khác nhau giữa C# và C++
Theo mình nghĩ cái khác biệt đầu tiên là: trong việc quản lý chương trình, Struct không cho đưa hàm vào trong đó, còn class thì có.
struct sẽ có lợi trong trường hợp cần truyền một nhóm thông tin vào hàm, chẳng hạn như thông tin sinh viên. Dĩ nhiên là ta có thể truyền cả lớp sinh viên vào nhưng phải làm các phương thức get để lấy dữ liệu ra, như vậy sẽ lâu hơn.
Struct không hỗ trợ việc thừa kế (nhưng có thể thực thi giao diện)
Không thể khai báo hàm khởi tạo hay hàm huy mặc định (không đối số). Nếu khai báo hàm khởi tạo có đối số thì phải khởi tạo giá trị cho tất cả các field của nó.
Cũng không thể khai báo và khởi tạo ngay các field.
Cấu trúc là một khiểu giá trị (nó thừa kế từ ValueType) (còn class là kiểu tham chiếu)
Khi truyền struct vào phuơng thức, nó được truyền theo giá trị chú không như class là truyền tham chiếu.
struct để chứa thông tin chương trình thì hay vì nó tốc độ truy suất nhanh hơn mấy lần lận.
Theo mình khi đã học lên hướng đối tượng thì không nên dùng struct làm gì nữa.
struct sẽ có lợi trong trường hợp cần truyền một nhóm thông tin vào hàm, chẳng hạn như thông tin sinh viên. Dĩ nhiên là ta có thể truyền cả lớp sinh viên vào nhưng phải làm các phương thức get để lấy dữ liệu ra, như vậy sẽ lâu hơn.
Struct không hỗ trợ việc thừa kế (nhưng có thể thực thi giao diện)
Không thể khai báo hàm khởi tạo hay hàm huy mặc định (không đối số). Nếu khai báo hàm khởi tạo có đối số thì phải khởi tạo giá trị cho tất cả các field của nó.
Cũng không thể khai báo và khởi tạo ngay các field.
Cấu trúc là một khiểu giá trị (nó thừa kế từ ValueType) (còn class là kiểu tham chiếu)
Khi truyền struct vào phuơng thức, nó được truyền theo giá trị chú không như class là truyền tham chiếu.
struct để chứa thông tin chương trình thì hay vì nó tốc độ truy suất nhanh hơn mấy lần lận.
Theo mình khi đã học lên hướng đối tượng thì không nên dùng struct làm gì nữa.
Re: Sự khác nhau giữa C# và C++
Uh, sẵn tiện đây cho mình hỏi, sự khác biệt giữa static và const luôn, mình khó phân biệt nó quá.
Re: Sự khác nhau giữa C# và C++
Ah..bạn có thể xem thêm trang này. Nhưng mà nó chỉ nói tổn quát thôi, không rõ ràng cho lắm.
[You must be registered and logged in to see this link.]
[You must be registered and logged in to see this link.]
Re: Sự khác nhau giữa C# và C++
Hình như bạn chưa đọc kĩ bài của mình. Mình thấy struct hỗ trợ thừa kế luôn. Còn đa hình thì mình chưa thử.Struct không hỗ trợ việc thừa kế (nhưng có thể thực thi giao diện)
Bạn nói phần thực thi giao diện là sao? Có thể giải thích rõ hơn cho mình được không?
struct có thể khai báo hàm tạo và hàm hủy luôn. Mình cũng đang ngạc nhiên nè.
Re: Sự khác nhau giữa C# và C++
Ah, cái mà mình nói là Struct trong C#, chứ k phải trong C .
Thường thì mình thấy CSharp là dùng class để chỉ các đối tượng. Nhưng khi muốn tạo những đối tượng cần ít bộ nhớ, mà lại cấp phát nhanh, thì dùng Struct. Struct là kiểu dữ liệu tự tạo, nhẹ hơn so với class. Struct cũng tương tự như class, là một cấu trúc dữ liệu có thể chứa các thành viên dữ liệu và thành viên hàm (bộ khởi tạo, phương thức,....)
"Nói là vậy, giữa struct và lớp vẫn có nhiều khác biệt. Struct khác lớp ở chỗ: struct là loại dữ liệu kiểu trị nghĩa là không được cấp phát bộ nhớ trên heap. Một biến struct sẽ chứa trực tiếp dữ liệu của struct, trong khi một biến kiểu lớp thì lại chứa một quy chiếu về dữ liệu được biết như là đối tượng. Ngoài ra, struct không hỗ trợ kế thừa và hàm hủy."
Struct trong C# khác với C là nó k hỗ trợ kế thừa. Struct không có hàm hủy nhưng có vẫn có hàm khởi dựng, nhưng các hàm này phải có thông số đấy nhé. 1 phần nữa mình nghe ng ta nói, nhưng chưa test thử, là struct thì cấp phát bộ nhớ trên stack (còn class thì trên heap).
Trong msdn, cũng có 1 bài nói về Struct trong C# này:
Thường thì mình thấy CSharp là dùng class để chỉ các đối tượng. Nhưng khi muốn tạo những đối tượng cần ít bộ nhớ, mà lại cấp phát nhanh, thì dùng Struct. Struct là kiểu dữ liệu tự tạo, nhẹ hơn so với class. Struct cũng tương tự như class, là một cấu trúc dữ liệu có thể chứa các thành viên dữ liệu và thành viên hàm (bộ khởi tạo, phương thức,....)
"Nói là vậy, giữa struct và lớp vẫn có nhiều khác biệt. Struct khác lớp ở chỗ: struct là loại dữ liệu kiểu trị nghĩa là không được cấp phát bộ nhớ trên heap. Một biến struct sẽ chứa trực tiếp dữ liệu của struct, trong khi một biến kiểu lớp thì lại chứa một quy chiếu về dữ liệu được biết như là đối tượng. Ngoài ra, struct không hỗ trợ kế thừa và hàm hủy."
Struct trong C# khác với C là nó k hỗ trợ kế thừa. Struct không có hàm hủy nhưng có vẫn có hàm khởi dựng, nhưng các hàm này phải có thông số đấy nhé. 1 phần nữa mình nghe ng ta nói, nhưng chưa test thử, là struct thì cấp phát bộ nhớ trên stack (còn class thì trên heap).
Trong msdn, cũng có 1 bài nói về Struct trong C# này:
public struct CoOrds
{
public int x, y;
public CoOrds(int p1, int p2)
{
x = p1;
y = p2;
}
}
// Declare and initialize struct objects.
class TestCoOrds
{
static void Main()
{
// Initialize:
CoOrds coords1 = new CoOrds();
CoOrds coords2 = new CoOrds(10, 10);
// Display results:
System.Console.Write("CoOrds 1: ");
System.Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
System.Console.Write("CoOrds 2: ");
System.Console.WriteLine("x = {0}, y = {1}", coords2.x, coords2.y);
}
}
Được sửa bởi nth ngày 23/01/10, 11:32 pm; sửa lần 1.
Re: Sự khác nhau giữa C# và C++
Còn về Struct trong C++, theo mình hiểu thỉ: nó được mở rộng tương đương với class . Tất cả những gì class làm đc thì struct cũng làm được . Class có private,protected,public, có phương thức, hàm bạn , lớp bạn, hàm khởi tạo....thì struct cũng có và thậm chí cả kế thừa.
Mình thử với 2 bài test sau:
Bài 1: dùng class (thông cảm nha,vd tham khảo viết bằng VS2005 nên bạn ráng xem nha)
Bài thứ 2 với Struct:
Mình thử với 2 bài test sau:
Bài 1: dùng class (thông cảm nha,vd tham khảo viết bằng VS2005 nên bạn ráng xem nha)
#include"iostream"
using namespace std;
class person{
private:
char name[20];
int age;
public:
void nhap(){
cout<<"nhap ho va ten:";
cin.getline(name,20);
cout<<"nhap tuoi";
cin>>age;
}
void hien(){
cout<<name<<" tuoi "<<age;
}
};
int main(){
person a;
a.nhap();
a.hien();
return 0;
}
Bài thứ 2 với Struct:
#include"iostream"
using namespace std;
struct person{
private:
char name[20];
int age;
public:
void nhap(){
cout<<"nhap ho va ten:";
cin.getline(name,20);
cout<<"nhap tuoi";
cin>>age;
}
void hien(){
cout<<name<<" tuoi "<<age;
}
};
int main(){
person a;
a.nhap();
a.hien();
return 0;
}
Similar topics
» Sự khác nhau giữa NAT và Bridged Adapter
» Khác biệt giữa QA, QC và Testing
» sự khác biệt giữa các version của Visual Studio 2010
» Cùng nhau thảo luận ASP.NET+AJAX
» truyền thông giữa 2 cửa sổ
» Khác biệt giữa QA, QC và Testing
» sự khác biệt giữa các version của Visual Studio 2010
» Cùng nhau thảo luận ASP.NET+AJAX
» truyền thông giữa 2 cửa sổ
Trang 1 trong tổng số 1 trang
Permissions in this forum:
Bạn không có quyền trả lời bài viết
|
|