it-swarm-vi.com

Sự khác biệt cơ bản giữa C và C ++ là gì?

Nhiều người có xu hướng viết "C/C++", như thể chúng là cùng một thứ. Mặc dù chúng có nhiều điểm tương đồng nhưng rõ ràng chúng không giống nhau.

Nhưng đâu là sự khác biệt cơ bản giữa C và C++? C++ có phải là phiên bản nâng cao của C hay có các tính năng trong C không tồn tại trong C++ không?

41
gablin

Các điểm sau liên quan đến C++:

  1. (do người dùng định nghĩa) hệ thống loại tĩnh : cho phép kiểm tra tĩnh về dữ liệu của bạn và việc sử dụng chúng - chỉ ra rất nhiều lỗi dễ thực hiện trong C.
  2. multi- "paradigm" : cho phép hoạt động như trong C, với các mô hình hướng đối tượng, với các mô hình chung, v.v.
  3. Con Contortor/Destructor : cách duy nhất để nói một lần phải làm gì khi tạo hoặc hủy một cái gì đó và chắc chắn rằng người dùng sẽ không phải tìm đúng chức năng và sử dụng nó như trong C.
  4. RAII (tên xấu) : bạn không phải luôn quản lý bộ nhớ. Chỉ cần giữ mọi thứ trong phạm vi và sử dụng con trỏ thông minh mô tả các đối tượng của bạn suốt đời. Vẫn có thể sử dụng con trỏ thô.
  5. Mẫu : tốt hơn macro, một ngôn ngữ thực để thao tác và tạo các loại trước khi biên dịch cuối cùng. Chỉ thiếu một hệ thống loại (xem Khái niệm trong các tiêu chuẩn C++ trong tương lai).
  6. Quá tải toán tử : cho phép mô tả các hoạt động theo cách cú pháp đơn giản và thậm chí để xác định các ngôn ngữ dành riêng cho miền được nhúng trong mã C++ của bạn.
  7. Tên có phạm vi : không gian tên, lớp/cấu trúc, hàm, v.v. có các quy tắc đơn giản để đảm bảo tên không bị xung đột.
  8. Hệ thống ngoại lệ : một cách để truyền lỗi thường tốt hơn mã trả về. Trong thực tế, mã trả về là tốt cho các lỗi logic cụ thể của miền, vì ứng dụng phải quản lý nó. Các ngoại lệ được sử dụng cho các lỗi "cứng", những điều làm cho đoạn mã sau không chính xác. Nó cho phép bắt lỗi cao hơn trong ngăn xếp cuộc gọi nếu có thể, phản ứng với ngoại lệ đó (bằng cách đăng nhập hoặc sửa trạng thái) và với RAII, nếu được sử dụng tốt, nó sẽ không làm cho toàn bộ chương trình bị sai - nếu được thực hiện tốt, một lần nữa.
  9. Thư viện chuẩn : C có cái riêng, nhưng tất cả đều "động". Thư viện chuẩn C++ hầu như (không phải IO luồng) được tạo từ các mẫu (thùng chứa và thuật toán) chỉ cho phép tạo mã cho những gì bạn sử dụng. Tốt hơn: vì trình biên dịch phải tạo mã, nó sẽ biết rất nhiều về bối cảnh và sẽ nhanh chóng áp dụng rất nhiều tối ưu hóa mà không cần phải yêu cầu bộ mã hóa làm xáo trộn mã của nó - nhờ vào các mẫu và những thứ khác.
  10. const-đúng: : Cách tốt nhất để đảm bảo bạn không thay đổi các biến bạn không nên. Cho phép chỉ định quyền truy cập chỉ đọc vào các biến. Và nó chỉ được kiểm tra tại thời gian biên dịch nên không có chi phí thời gian chạy.
43
Klaim

C++ được phát minh để quản lý sự phức tạp mà C không thể xử lý. Ví dụ, một vấn đề phổ biến với C là bạn có thể "hết tên cho các biến" (tất nhiên không được hiểu theo nghĩa đen) vì không có sự đóng gói, không gian tên, v.v.

Ngoài ra, C không có ngoại lệ, do đó việc xử lý lỗi rất dễ xảy ra lỗi, vì nó phụ thuộc vào người dùng thư viện để luôn kiểm tra giá trị trả về của các hàm, trong khi với ngoại lệ, nhà phát triển thư viện chỉ cần ném một ngoại lệ để đảm bảo luồng chương trình sẽ bị dừng.

C++ giúp bằng cách có các đối tượng init constructor được trình biên dịch tự động gọi. Không giống như các cấu trúc C cần được khởi tạo bởi người lập trình (do đó, một khu vực dễ bị lỗi khác).

Cuối cùng, có rất nhiều lợi thế khác được OOP chào mời, chẳng hạn như tái sử dụng đối tượng cũng như các khái niệm dựa trên lập trình chung, chẳng hạn như các mẫu và tổng quát cho phép bạn sử dụng lại mã nguồn, v.v.

31
Jas

Nói chung, mọi thứ tồn tại trong C đều được hỗ trợ trong C++. Rõ ràng điều ngược lại là hoàn toàn sai.

Nói một cách đơn giản, C++ là hướng đối tượng (vì vậy, ví dụ, bạn có các lớp), C thì không.

C++ có loại C89 boolean không.

Chúng là những ngôn ngữ khác nhau. Họ chỉ chia sẻ hầu hết các cú pháp.

15
Federico klez Culloca

C99 có một vài tính năng không tồn tại (ít nhất là ở dạng chính xác) trong C++ (ví dụ: thành viên mảng linh hoạt, mảng có độ dài thay đổi, v.v.)

C99 cũng đã thêm rất nhiều vào thư viện không có trong tiêu chuẩn C++ 98/03; hầu hết điều này đã được thêm vào C++ 11.

Về mặt định hướng cơ bản, C về cơ bản hỗ trợ lập trình thủ tục có cấu trúc. C++ hỗ trợ điều đó cũng như lập trình hướng đối tượng, lập trình chung và siêu lập trình (thực hiện tính toán tùy ý tại thời gian biên dịch). Với C++ 11, nó thêm một vài bit và phần ít nhất có thể bị nhầm lẫn với hỗ trợ lập trình chức năng (ví dụ: biểu thức lambda). C++ 14 đã thêm một vài chi tiết, nhưng hầu hết trong số chúng thực sự tiện lợi hơn là bất kỳ thay đổi lớn nào trong định hướng.

8
Jerry Coffin

Cá nhân, tôi nghĩ rằng các mẫu là tính năng quan trọng nhất mà C++ thêm vào C.

1
zvrba