Liệu C và C++ có bao giờ bị thất sủng không?

Chỉ đơn giản là quen thôi, nhưng cú pháp như vậy là không nhất quán. Rõ ràng a có kiểu dữ liệu là int[], lẽ ra cú pháp như vậy phải là SAI.

Các ngôn ngữ hướng đối tượng mình biết thì array là class nên không khai báo mảng trên stack như C/C++ được. Một đối tượng mảng buộc phải khai báo trên heap thông qua toán tử new hoặc các array object khác. Nhưng cách khai báo như vậy tuân thủ quy định chung về cú pháp khai báo: <kiểu dữ liệu> <TênBiến>; hoặc <kiểu dữ liệu> <TênBiến> = <đối tượng>; (ví dụ int[] a = new int[10];) (Đây mới là cách Java hay dùng)

C++ đi lên từ C, trong C thì mảng chẳng phải struct cũng chẳng phải class, chỉ đơn giản là một kiểu dữ liệu. Thế nên khai báo tầm bậy cũng chả chết ai, khai báo mảng 10 phần tử xong truy cập đến phần tử thứ 15 cũng ok.

Việc khai báo trên stack chẳng nhanh hơn so với khai báo trên heap là bao nhiêu, chỉ đảm bảo ứng dụng không bị memory leak. Tuy nhiên stack cung cấp cho mỗi ứng dụng là có hạn, tuỳ theo kiến trúc hệ điều hành (64 bit/32 bit…), trong khi heap thì vô tận, chừng nào RAM còn chỗ. Chính việc khai báo các biến trên stack mới chiếm chỗ bộ nhớ, nếu như LTV có khả năng quản lý tốt cấp phát động. Hoặc như các ngôn ngữ hướng đối tượng phổ biến như Java, C# thì sẽ có GC lo liệu.

4 Likes

Mà đúng là cú pháp của C nó đẹp, học thích hơn mấy ngôn ngữ khác :v

2 Likes

Chính xác là C++ và C đều kế thừa từ ANSI C cũ
Giờ có C++17 và C11 rồi

Khi theo ngôn ngữ nào tuân theo cú pháp của ngôn ngữ đó, Java không theo cú pháp C++ thì không thể chê Java được. Tương tự: Python sao không viết camelCase như Java, Java không xem tất cả là object như Ruby, PHP chỉ có array mà không linh hoạt như thư viện Collection trong Java, C++ không có interface, Python không hỗ trợ enumeration, blabla…

5 Likes

8 posts were merged into an existing topic: Topic chứa các reply được cho là off-topic - version 2

Thực ra thì C++ nó ép hết vào multiple parent nên khó có thể nói rằng đó không phải interface.
Chỉ là ít người xài kiểu đó thôi.
Việc ôm quá nhiều thứ cũng là điểm trừ của C++

3 Likes

Abstract class của C++ nó làm quá nhiều chức năng: interface, protocol (Apple Objective-C, Swift), abstract class.

Mình đọc các sách như Design Pattern GoF, Code Complete, tác giả vẫn khuyên chỉ dùng abstract class cho 1 nhiệm vụ duy nhất (interface, protocol, base class). Mình thường dùng cho chức năng interface.

Ai lạm dụng thì ăn hành :grin:

2 Likes

Tại sao vậy nhỉ ???

4 Likes

Vì đa phần C/C++ dùng để lập trình nhúng nhiều lắm anh ạ!

À tất nhiên cái đấy mình biết nhưng C/C++ chỉ là một trong những ngôn ngữ để lập trình nhúng. Ngoài C/C++ còn những ngôn ngữ khác như ASM, vhdl…
Mà thực tế thì RAM, Chip đã ra đời và được sử dụng trước khi C/C++ ra đời và nó cũng không phải là để cung cấp cho mỗi nhúng. Nên sự tồn tại của nó tách biệt với sự tồn tại của C/C++.

6 Likes

vậy là bạn không hiểu về tổ chức vùng nhớ rồi, mảng bản chất của nó là các ô nhớ liền kề với nhau, không phải struct cũng chả phải class, ngôn ngữ nào cũng có kiểu tổ chức như vậy hết, khi khai báo int[] a = new int[10] chẳng hạn, a đơn giản chỉ là một con trỏ

Đó chính là ưu điểm và cũng là nhược điểm chí mạng của C/C++, nó không hề kiểm tra giá trị biên, cho nên có thể lợi dụng lỗi này để tấn công (buffer overflow chẳng hạn), đã thế, nếu như vùng nhớ nằm ngoài phần tử thứ 10 của nó mà được cấp phát là xác cmn định.

Đó chỉ là cái vỏ thôi, cái nhân thì cùng một kiểu là các ô nhớ nằm cạnh nhau, các ngôn ngữ hiện đại đưa array làm thành một class là để tiện cho việc kiểm tra biên, chống buffer overflow, với khỏi cần khai báo mấy biến “râu ria” như biến chiều dài mảng.

2 Likes

:slight_smile:
Đã nói nó là class tức là nó là class -_- Mỗi array có đầy đủ các thuộc tính của một object. Tức là có thuộc tính, có phương thức, có contructor, destructor, có các thành phần pub và private. Đúng là nó dựa trên cấu trúc của các ô nhớ liền kề, nhưng không có nghĩa là nó chỉ gồm các ô nhớ liền kề như C/C++.

Và vấn đề mình nói ban đầu là vấn đề cú pháp, sao bạn cứ phải lấy kiến trúc ra làm gì?

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?