Sự khác nhau giữa C# và C++

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down

Sự khác nhau giữa C# và C++

Bài gửi by nth on 26/08/09, 03:16 pm

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

nth
Admin
Admin

Tổng số bài gửi : 550
Số điểm : 1113
Số lần được cám ơn : 33
Ngày đến diễn đàn: : 01/08/2009
Tuổi : 28
Đến từ : Thiên Đường

Xem lý lịch thành viên http://thuhuong.hot4um.com

Về Đầu Trang Go down

Re: Sự khác nhau giữa C# và C++

Bài gửi by anbinhtrong on 18/10/09, 09:43 pm

Hình như struct trong C++ không mang tính thừa kế.

anbinhtrong
Mod
Mod

Tổng số bài gửi : 77
Số điểm : 142
Số lần được cám ơn : 32
Ngày đến diễn đàn: : 18/10/2009
Tuổi : 27
Đến từ : BT

Xem lý lịch thành viên http://khoahockithuat.blogspot.com

Về Đầu Trang Go down

Re: Sự khác nhau giữa C# và C++

Bài gửi by nth on 19/10/09, 08:14 pm

Có, nó có tính thừa kế..

nth
Admin
Admin

Tổng số bài gửi : 550
Số điểm : 1113
Số lần được cám ơn : 33
Ngày đến diễn đàn: : 01/08/2009
Tuổi : 28
Đến từ : Thiên Đường

Xem lý lịch thành viên http://thuhuong.hot4um.com

Về Đầu Trang Go down

Re: Sự khác nhau giữa C# và C++

Bài gửi by anbinhtrong on 20/10/09, 12:28 am

Đúng rồi. Mình thử dòng này:
#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? Question Question Question

anbinhtrong
Mod
Mod

Tổng số bài gửi : 77
Số điểm : 142
Số lần được cám ơn : 32
Ngày đến diễn đàn: : 18/10/2009
Tuổi : 27
Đến từ : BT

Xem lý lịch thành viên http://khoahockithuat.blogspot.com

Về Đầu Trang Go down

Re: Sự khác nhau giữa C# và C++

Bài gửi by nth on 21/10/09, 04:18 pm

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.

nth
Admin
Admin

Tổng số bài gửi : 550
Số điểm : 1113
Số lần được cám ơn : 33
Ngày đến diễn đàn: : 01/08/2009
Tuổi : 28
Đến từ : Thiên Đường

Xem lý lịch thành viên http://thuhuong.hot4um.com

Về Đầu Trang Go down

Re: Sự khác nhau giữa C# và C++

Bài gửi by nth on 21/10/09, 04:27 pm

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á.

nth
Admin
Admin

Tổng số bài gửi : 550
Số điểm : 1113
Số lần được cám ơn : 33
Ngày đến diễn đàn: : 01/08/2009
Tuổi : 28
Đến từ : Thiên Đường

Xem lý lịch thành viên http://thuhuong.hot4um.com

Về Đầu Trang Go down

Re: Sự khác nhau giữa C# và C++

Bài gửi by nth on 21/10/09, 04:32 pm

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.]

nth
Admin
Admin

Tổng số bài gửi : 550
Số điểm : 1113
Số lần được cám ơn : 33
Ngày đến diễn đàn: : 01/08/2009
Tuổi : 28
Đến từ : Thiên Đường

Xem lý lịch thành viên http://thuhuong.hot4um.com

Về Đầu Trang Go down

Re: Sự khác nhau giữa C# và C++

Bài gửi by anbinhtrong on 21/10/09, 09:07 pm

Struct không hỗ trợ việc thừa kế (nhưng có thể thực thi giao diện)
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ử.
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è. Smile

anbinhtrong
Mod
Mod

Tổng số bài gửi : 77
Số điểm : 142
Số lần được cám ơn : 32
Ngày đến diễn đàn: : 18/10/2009
Tuổi : 27
Đến từ : BT

Xem lý lịch thành viên http://khoahockithuat.blogspot.com

Về Đầu Trang Go down

Re: Sự khác nhau giữa C# và C++

Bài gửi by nth on 21/10/09, 09:24 pm

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:
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.

nth
Admin
Admin

Tổng số bài gửi : 550
Số điểm : 1113
Số lần được cám ơn : 33
Ngày đến diễn đàn: : 01/08/2009
Tuổi : 28
Đến từ : Thiên Đường

Xem lý lịch thành viên http://thuhuong.hot4um.com

Về Đầu Trang Go down

Re: Sự khác nhau giữa C# và C++

Bài gửi by nth on 21/10/09, 09:33 pm

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)
#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;
}

nth
Admin
Admin

Tổng số bài gửi : 550
Số điểm : 1113
Số lần được cám ơn : 33
Ngày đến diễn đàn: : 01/08/2009
Tuổi : 28
Đến từ : Thiên Đường

Xem lý lịch thành viên http://thuhuong.hot4um.com

Về Đầu Trang Go down

Re: Sự khác nhau giữa C# và C++

Bài gửi by Sponsored content Today at 11:33 pm


Sponsored content


Về Đầu Trang Go down

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết