1. Vấn đề nó giải quyết
C và C++ chia sẻ nhiều cú pháp, nhưng là hai ngôn ngữ riêng. C++ cho phép kết hợp lập trình thủ tục, hướng đối tượng và lập trình tổng quát; class, template và cơ chế hủy đối tượng giúp tổ chức dữ liệu lẫn quản lý tài nguyên.
2. Kiến thức cần có
Biết biến, hàm, mảng và con trỏ cơ bản.
Hiểu rằng bộ nhớ được cấp phát cần có nơi chịu trách nhiệm giải phóng.
3. Ý tưởng cốt lõi
C++ phát triển từ C, bổ sung các cơ chế như tham chiếu, nạp chồng hàm, template, exception và thư viện container/thuật toán. Bạn có thể viết chương trình C++ hữu ích mà không cần xây dựng hệ phân cấp kế thừa.
Một khác biệt thực tế là quyền quản lý tài nguyên (ownership): std::vector<int> giữ vùng nhớ cho các phần tử và tự giải phóng khi đối tượng bị hủy. Cách gắn tài nguyên với vòng đời đối tượng này gọi là RAII.
4. Cú pháp tối thiểu
std::vector<int> values{1, 2, 3};
values.push_back(4);Với <vector>, container quản lý kích thước và vùng nhớ cho bạn. Trong C, một mảng động thường cần kết hợp con trỏ, số phần tử, dung lượng và các lời gọi cấp phát/giải phóng riêng.
5. Cách nó hoạt động
Kiểu và cú pháp: không phải mọi chương trình C hợp lệ đều là C++ hợp lệ. Ví dụ, chuyển ngầm
void*sangint*được C cho phép nhưng C++ yêu cầu chuyển kiểu rõ ràng.Tái sử dụng mã: template có thể tạo hàm/container cho nhiều kiểu, với kiểm tra kiểu lúc biên dịch.
Vòng đời đối tượng (lifetime): constructor thiết lập đối tượng, destructor dọn tài nguyên. Đối tượng tự động được hủy khi rời phạm vi; exception có thể kích hoạt quá trình dọn các phạm vi đang thoát.
Thư viện:
std::vector,std::stringvà thuật toán chuẩn giúp biểu diễn ý định ở mức cao hơn con trỏ và vòng lặp thủ công.
Các khác biệt tương thích cụ thể được liệt kê trong phụ lục C của bản thảo C++.
6. Lỗi thường gặp
Cho rằng đổi đuôi
.cthành.cpplà đủ để chuyển một chương trình C.Cho rằng C++ bắt buộc dùng kế thừa hoặc mọi lời gọi hàm thành viên đều là lời gọi ảo.
Cho rằng C++ tự thu gom mọi vùng nhớ:
newkhông có nơi quản lý vẫn có thể gây rò rỉ.Cho rằng mọi trừu tượng C++ đều miễn phí; chi phí phụ thuộc thiết kế, kiểu dữ liệu và cách dùng.
7. Khi nào nên dùng
Khi chuyển mã C sang C++, bắt đầu từ trách nhiệm quản lý bộ nhớ và các quy tắc kiểu. Trong mã C++ mới, dùng container và đối tượng quản lý tài nguyên để giảm các đường dọn thủ công, rồi đo chi phí nếu hiệu năng là yêu cầu.
8. Ví dụ đơn giản
Trong mã mẫu C++20, template cộng các phần tử mà không sao chép vector:
template<class T>
T sum(const std::vector<T>& values) {
T result{};
for (const T& value : values) result += value;
return result;
}Với std::vector<int>{1, 2, 3}, kết quả in ra là 6. T phải hỗ trợ khởi tạo và +=; với kiểu số nguyên có dấu, tổng cũng phải nằm trong miền biểu diễn.
Mã mẫu hoàn chỉnh
Tệp mã nguồn
dailycppinterview/147_what-is-cpp-and-how-is-it-different-from-c/main.cpp
// Real-World C++ Interviews Q147: What is C++? How is it different from C?
// Key: C++ is a general-purpose, multi-paradigm language that evolved from C and adds
// abstraction mechanisms such as classes, templates, RAII, overloading, exceptions, and a rich
// standard library. C and C++ share much syntax but are separate languages with different type
// rules, object and lifetime models, valid programs, and idioms; C++ is not merely C with
// classes.
#include <iostream>
#include <vector>
template<class T>
T sum(const std::vector<T>& values) {
T result{};
for (const T& value : values) result += value;
return result;
}
int main() {
const std::vector<int> values{1, 2, 3};
std::cout << sum(values) << std::endl;
}
9. Điều cần nhớ
Hãy giải thích khác biệt bằng một ví dụ cụ thể: cùng bài toán mảng động, C++ có thể dùng vector để gói dữ liệu, thao tác và việc giải phóng tài nguyên vào một đối tượng.
10. Câu hỏi tự kiểm tra
Đề đầy đủ: C++ là gì và khác C như thế nào?
Trong ví dụ sum, template, tham chiếu const và destructor của vector giải quyết ba việc gì? Hãy nêu một đoạn C hợp lệ nhưng không hợp lệ trong C++.