Mẫu hình | Lập trình đa hình: lập trình thủ tục, lập trình hàm, lập trình hướng đối tượng, lập trình tổng quát |
---|---|
Thiết kế bởi | Bjarne Stroustrup |
Xuất hiện lần đầu | 1985; 40 năm trước |
Phiên bản ổn định | ISO/IEC 14882:2017
/ 1 tháng 12 năm 2017; 7 năm trước |
Kiểm tra kiểu | Static, nominative, partially inferred |
Ngôn ngữ thực thi | C++ hoặc C |
Phần mở rộng tên tập tin | .C.cc.cpp.cxx .c++.h.hh.hpp.hxx .h++ |
Trang mạng | isocpp |
Các bản triển khai lớn | |
LLVM Clang, GCC, Microsoft Visual C++, Embarcadero C++Builder, Intel C++ Compiler, IBM XL C++, EDG | |
Ảnh hưởng từ | |
Ada, ALGOL 68, C, CLU, ML, Simula | |
Ảnh hưởng tới | |
Ada 95, C#, C99, Chapel, D, Java, Lua, Perl, PHP, Python, Rust, Nim | |
|
C++ (còn gọi là C Plus Plus hoặc CPP, phát âm: /siː pləs pləs/) là một ngôn ngữ lập trình đa dụng cấp cao, được phát triển bởi Bjarne Stroustrup như một bản nâng cấp của ngôn ngữ C, ban đầu với tên gọi "C với Class". Qua thời gian, ngôn ngữ này không ngừng được cải tiến, tích hợp nhiều tính năng hiện đại như: lập trình đa hình, lập trình hướng đối tượng, lập trình tổng quát, thao tác bộ nhớ cấp thấp, kiểu dữ liệu trừu tượng và hỗ trợ đa mẫu hình. Kể từ những năm 1990, C++ đã khẳng định vị thế là một trong những ngôn ngữ lập trình thương mại được ưa chuộng nhất.
C++ được tối ưu hóa cho phát triển phần mềm hệ thống và ứng dụng nhúng trên vi xử lý, từ thiết bị có tài nguyên giới hạn đến hệ thống lớn. Với ưu điểm về tốc độ xử lý nhanh, hiệu suất cao và khả năng tùy biến mạnh mẽ, C++ hiện diện trong nhiều lĩnh vực: từ game, phần mềm desktop, hệ thống server (như máy chủ web, cơ sở dữ liệu SQL) đến các ứng dụng đòi hỏi hiệu năng cực cao (ví dụ: hệ thống viễn thông hoặc thiết bị không gian). Được biên dịch đa nền tảng (Windows, Linux, Mac OS, Unix), C++ có nhiều trình biên dịch từ các hãng uy tín như Microsoft, Intel, IBM hay Tổ chức Phần mềm Tự do.
Tiêu chuẩn hóa bởi ISO, phiên bản mới nhất của C++ là ISO/IEC 14882:2017 (C++17) ra mắt tháng 12/2017, kế thừa và phát triển từ các chuẩn trước như C++03, C++11, C++14. Ban đầu được Stroustrup phát triển tại Bell Labs từ 1979 như một mở rộng của C, C++ giữ lại hiệu suất của C đồng thời bổ sung các tính năng tổ chức mã cao cấp. C++20 là chuẩn tiếp theo đang được phát triển, duy trì chu kỳ cập nhật 3 năm/lần.
C++ đã truyền cảm hứng cho nhiều ngôn ngữ khác như C#, Java, D và các phiên bản C hiện đại.
Khởi đầu với Hello World
Trong mọi ngôn ngữ lập trình, Hello World luôn là bài tập nhập môn cơ bản nhất dành cho người mới bắt đầu
#include <iostream> int main() { std::cout << "Hello World" << std::endl; return 0; }
Những điểm nổi bật về kỹ thuật

Năm | Tiêu chuẩn C++ | Tên gọi |
---|---|---|
1998 | ISO/IEC 14882:1998 | C++98 |
2003 | ISO/IEC 14882:2003 | C++03 |
2011 | ISO/IEC 14882:2011 | C++11, C++0x |
2014 | ISO/IEC 14882:2014 | C++14, C++1y |
2017 | ISO/IEC 14882:2017 | C++17, C++1z |
2020 | ISO/IEC 14882:2020 | C++20, C++2a |
C++ phiên bản 1998 được xây dựng trên hai trụ cột chính: phần lõi ngôn ngữ và hệ thống Thư viện Mẫu Chuẩn (STL). STL kế thừa phần lớn chức năng từ thư viện C tiêu chuẩn với những cải tiến đáng kể, đồng thời bổ sung nhiều tính năng mới. Ngoài ra, cộng đồng phát triển còn tạo ra các thư viện mở rộng như Boost để hỗ trợ thêm cho lập trình viên. Điểm đặc biệt là hầu hết mã nguồn viết bằng C đều có thể tích hợp dễ dàng vào dự án C++.
Những đột phá công nghệ trong C++
C++ mang đến nhiều cải tiến vượt bậc so với C, bao gồm: cú pháp khai báo biến ngắn gọn, phương thức chuyển đổi kiểu dữ liệu mới, cơ chế quản lý bộ nhớ động new/delete, kiểu logic bool, biến tham chiếu, hằng số const, hàm inline tối ưu tốc độ, tham số mặc định, nạp chồng hàm, không gian tên namespace, hệ thống lập trình hướng đối tượng hoàn chỉnh (kế thừa, phương thức, đa hình, lớp trừu tượng và hàm khởi tạo), nạp chồng toán tử, template, toán tử phạm vi ::, xử lý ngoại lệ và nhận dạng kiểu động.
Hệ thống kiểm tra kiểu dữ liệu trong C++ được thiết kế chặt chẽ và an toàn hơn nhiều so với C.
Cú pháp ghi chú bằng // là một trong những đặc điểm được C++ thừa hưởng từ ngôn ngữ BCPL tiền nhiệm.
Nhiều tính năng ban đầu của C++ sau này đã được tích hợp vào ngôn ngữ C, chẳng hạn như từ khóa const, hàm inline, cách khai báo biến trong vòng lặp for và kiểu chú thích dùng dấu //. Tuy nhiên, chuẩn C99 cũng giới thiệu một số tính năng độc đáo không tồn tại trong C++, điển hình là macro hỗ trợ số lượng tham số biến đổi.
Do có nguồn gốc phát triển từ C, thuật ngữ 'đối tượng' trong C++ mang ý nghĩa là vùng nhớ giống như trong C, chứ không phải là một thể hiện của lớp như cách hiểu thông thường trong các ngôn ngữ hướng đối tượng khác. Ví dụ cụ thể:
- int i;
Câu lệnh này sẽ tạo ra một đối tượng kiểu số nguyên int, tương đương với việc cấp phát một vùng bộ nhớ để lưu trữ giá trị của biến i.
Hệ thống thư viện trong C++
Thư viện chuẩn C++ kế thừa và tối ưu hóa thư viện C truyền thống để tương thích tốt hơn với ngôn ngữ này. Phần quan trọng khác là Thư viện Mẫu Chuẩn (STL) cung cấp các công cụ mạnh mẽ như container (vector, danh sách liên kết), iterator (mở rộng từ khái niệm con trỏ) giúp truy cập dữ liệu dễ dàng như mảng. Ngoài ra còn có map (mảng kết hợp), set với giao diện đồng nhất, cho phép viết các thuật toán tổng quát làm việc với mọi container hoặc dãy xác định bởi iterator. Giống C, ta dùng #include để thêm 69 header chuẩn (19 header đã lỗi thời).
Được thiết kế bởi các chuyên gia đầu ngành và kiểm chứng qua thời gian, các thành phần thư viện chuẩn luôn được ưu tiên sử dụng thay cho giải pháp tự viết. Ví dụ: std::vector và std::string không chỉ tiện lợi hơn mảng thông thường mà còn đảm bảo an toàn và linh hoạt trong phát triển phần mềm.
STL ban đầu là thư viện của HP và SGI trước khi trở thành chuẩn C++. Dù tiêu chuẩn không gọi tên "STL" mà coi nó là phần của thư viện chuẩn, nhiều người vẫn dùng thuật ngữ này để phân biệt với các thành phần khác như IOstream, xử lý đa ngôn ngữ, debug hay thư viện C kế thừa.
Dự án STLPort phát triển từ SGI STL, duy trì các bản cập nhật cho STL, IOStream và string. Các nhà cung cấp compiler C++ đều tích hợp thư viện chuẩn với những tối ưu riêng, đáp ứng kỳ vọng của lập trình viên về một thành phần không thể thiếu này.
Tính năng hướng đối tượng trong C++
C++ bổ sung các tính năng hướng đối tượng (OOP) nâng cao so với C, cung cấp lớp (class) với 4 đặc trưng cơ bản của OOP: trừu tượng hóa, đóng gói, đa hình và kế thừa.
Lưu ý quan trọng: Trong ngữ cảnh này, các thuật ngữ 'hàm thành viên', 'phương thức' hay đơn giản là 'hàm' đều được hiểu là phương thức thuộc về một lớp cụ thể.
Nguyên lý đóng gói dữ liệu
C++ triển khai tính đóng gói thông qua các từ khóa truy cập public, private và protected. Thành viên private chỉ có thể truy cập bởi các phương thức cùng lớp hoặc hàm/lớp được chỉ định là friend. Thành viên protected cho phép truy cập từ lớp con kế thừa, cùng với chính lớp đó và các friend được phép.
Mặc dù OOP khuyến nghị chỉ các phương thức mới được phép truy cập dữ liệu nội bộ, C++ linh hoạt cho phép khai báo dữ liệu là public hoặc toàn bộ lớp public. Điều này phản ánh triết lý đa mô hình của C++ khi hỗ trợ cả lập trình module bên cạnh OOP.
Một nguyên tắc vàng trong lập trình hướng đối tượng là luôn khai báo dữ liệu ở chế độ private hoặc protected, đồng thời cung cấp một tập hợp phương thức công khai (public methods) như một giao diện an toàn để truy cập, qua đó che giấu hoàn toàn cơ chế triển khai bên trong lớp.
Hiện tượng đa hình
Đa hình là một khái niệm phổ biến nhưng thường bị hiểu sai hoặc sử dụng không chính xác do thiếu định nghĩa rõ ràng.
Về bản chất, đa hình trong lập trình nghĩa là cùng một đoạn mã có thể cho các kết quả khác nhau tùy ngữ cảnh thực thi. Chính khả năng 'một nhiều' này đã tạo nên tên gọi đa hình (nhiều hình thái).
Trong C++, đa hình thường thể hiện qua việc các hàm thành viên có thể trùng tên nhưng khác biệt nhờ một hoặc cả hai yếu tố sau:
- Khác biệt về số lượng và kiểu dữ liệu tham số (hay còn gọi là signature của hàm). Đây là dạng đa hình tĩnh (static polymorphism)
- Kiểu dữ liệu thực tế của đối tượng (khi hàm được khai báo với từ khóa virtual). Đây là dạng đa hình động (dynamic polymorphism)
Trình biên dịch sẽ dựa vào hai yếu tố này để xác định phiên bản chính xác của hàm cần thực thi trong số các hàm trùng tên.
Minh họa cụ thể về hai loại đa hình:
/* Đa hình tĩnh */ extern int SendJobToDevice(PrintJobText *, DeviceLaser *); extern void SendJobToDevice(PrintJobText *, DeviceJet *); extern void SendJobToDevice(PrintJobHTML *, DeviceLaser *); extern void SendJobToDevice(PrintJobHTML *, DeviceJet *);... SendJobToDevice(printJob, device); /* Đa hình động */ class Device { public: virtual void print(PrintJob*);... }; PrintJob *printJob; Device *device;... device->print(printJob); // Lưu ý: Do C++ không hỗ trợ multiple dispatch nên hàm trên // chỉ xác định kiểu đa hình dựa trên loại device
Ví dụ bổ sung về đa hình động:
class Person { public: virtual void Greet() // Virtual function { cout << "I don't know how to greet"; }; }; //------------------ class Vietnamese: public Person { public: void Greet() { cout << "Xin chao."; } }; //------------------ class English: public Person { public: void Greet() { cout << "Hello."; } }; //------------------ int main() { cout<<"Toi la Nguyen Huy Hoang\n"; Person *p; Vietnamese vn; English en; p = &vn; p->Greet(); // (*) p = &en; p->Greet(); // Same line of code as (*) but produces different result return 0; }
Trong ngôn ngữ C, đa hình động có thể được mô phỏng bằng cách sử dụng câu lệnh switch hoặc thông qua con trỏ hàm.
C++ cung cấp hai cơ chế đặc biệt để hỗ trợ đa hình:
- Nạp chồng toán tử: Cho phép cùng một toán tử hoặc hàm có các hành vi khác nhau tùy thuộc vào kiểu dữ liệu của các toán hạng hoặc tham số khi được gọi.
Ví dụ minh họa: float Demo(float a, float b) {return a + b;} và int Demo(int a, int b) {return a - b;} là hai hàm cùng tên nhưng thực hiện phép toán khác nhau tùy kiểu dữ liệu đầu vào.
Chúng ta có thể định nghĩa lại toán tử cộng cho lớp MATRIX, cho phép thực hiện phép toán C = A + B khi A, B và C đều thuộc kiểu MATRIX.
- Tính chất ảo (virtual): Cho phép phương thức (hàm thành viên hoặc toán tử) của lớp cha có thể được định nghĩa lại trong các lớp con (Như phương thức Chao() trong ví dụ trước).
Hai tính năng này giúp chương trình có thể xác định nhiều phiên bản khác nhau của cùng một hàm để phù hợp với các kiểu đối tượng khác nhau.
Kỹ thuật nạp chồng hàm cho phép khai báo nhiều hàm cùng tên (kể cả trong cùng một lớp). Các hàm này được phân biệt thông qua số lượng và kiểu dữ liệu của tham số. Ví dụ, chúng ta có thể khai báo 3 hàm sau:
void pageUser(int userid); void pageUser(int userid, string message); void pageUser(string username);
Khi trình biên dịch gặp lệnh gọi hàm pageUser(), nó sẽ xác định phiên bản hàm cụ thể dựa trên số lượng và kiểu dữ liệu của các tham số truyền vào (tức là dựa vào signature của hàm). Đây được gọi là đa hình tĩnh vì việc phân giải được thực hiện ngay tại thời điểm biên dịch.
Lưu ý quan trọng: Trình biên dịch không phân biệt các hàm qua kiểu trả về, do đó không thể nạp chồng hai hàm có cùng tên và tham số nhưng khác kiểu trả về trong cùng một lớp.
Nạp chồng toán tử (operator overloading) là một dạng đặc biệt của nạp chồng hàm. Đây là một trong những tính năng gây tranh cãi nhất của C++. Một số lập trình viên cho rằng nó thường bị lạm dụng, trong khi số khác xem đây là công cụ mạnh mẽ giúp mã nguồn trở nên rõ ràng và biểu cảm hơn thông qua các ký hiệu toán tử quen thuộc.
Danh sách các toán tử có thể được nạp chồng trong C++
Nạp chồng hàm cho phép định nghĩa nhiều phiên bản của cùng một hàm để xử lý các kiểu dữ liệu đầu vào khác nhau, trong khi nạp chồng toán tử giúp tái định nghĩa cách hoạt động của các toán tử cho các kiểu dữ liệu tùy chỉnh.
Integer& operator++();
Khi đó, toán tử ++ có thể được sử dụng trực tiếp với các đối tượng thuộc lớp Integer. Ví dụ minh họa:
Integer a = 2; ++a;
sẽ tương đương với việc thực hiện:
Integer a = 2; a.operator++();
Thông thường, đoạn mã này sẽ tăng giá trị của biến a lên 1 đơn vị. Tuy nhiên, người thiết kế lớp Integer có thể tự do định nghĩa lại hành vi của toán tử ++. Vì toán tử thường được sử dụng ngầm định, nên chỉ nên nạp chồng khi ý nghĩa của nó rõ ràng và trực quan. Một số tranh cãi tồn tại xung quanh việc thư viện chuẩn C++ sử dụng toán tử dịch bit << cho cout, dù không hoàn toàn phù hợp về mặt ngữ nghĩa nhưng vẫn được chấp nhận rộng rãi.
Template trong C++ tận dụng mạnh mẽ đa hình tĩnh, bao gồm cả việc nạp chồng các toán tử.
Hàm ảo mang đến một hình thức đa hình khác, cho phép các đối tượng thuộc cùng lớp cơ sở nhưng có thể xử lý hàm theo cách riêng. Ví dụ, lớp cơ sở PrintJob có thể chứa phương thức:
virtual int getPageCount(double pageWidth, double pageHeight)
Các lớp dẫn xuất như DoubleSpacedPrintJob có thể định nghĩa lại phương thức tính số trang in theo cách riêng. Khác với nạp chồng hàm, các tham số của hàm ảo luôn cố định về số lượng và kiểu dữ liệu, chỉ có kiểu đối tượng gọi hàm là thay đổi.
Khi gọi hàm ảo, trình biên dịch thường không xác định được kiểu đối tượng tại thời điểm biên dịch, nên không thể quyết định phiên bản hàm nào sẽ được gọi. Quyết định này được hoãn lại đến thời gian chạy, khi chương trình kiểm tra kiểu đối tượng thực tế để chọn hàm phù hợp. Đây chính là cơ chế đa hình động.
Quá trình xác định và thực thi hàm tại thời gian chạy được gọi là dynamic dispatch. Trong C++, cơ chế này thường được triển khai thông qua bảng hàm ảo (virtual table).
Nguyên lý kế thừa
C++ hỗ trợ ba loại kế thừa: public, protected và private, quy định phạm vi truy cập của các thành viên lớp cơ sở trong lớp dẫn xuất. Chỉ có kế thừa kiểu public là tuân thủ đúng nghĩa kế thừa trong OOP. Nếu không chỉ định, mặc định là private cho class và public cho struct.
C++ cho phép khai báo lớp cơ sở ảo bằng từ khóa virtual, đảm bảo chỉ tồn tại một thể hiện duy nhất của lớp cơ sở trong hệ thống phân cấp kế thừa, giúp giải quyết vấn đề nhập nhằng trong đa kế thừa.
Đa kế thừa là tính năng gây nhiều tranh luận trong C++, cho phép một lớp dẫn xuất từ nhiều lớp cơ sở khác nhau. Ví dụ, lớp 'Buổi học' có thể kế thừa từ cả 'Thời gian' và 'Môn học'. Một số ngôn ngữ như Java chỉ cho phép kế thừa từ một lớp nhưng có thể triển khai nhiều interface - khác với lớp thông thường, interface không chứa cài đặt cụ thể.
Triết lý thiết kế C++
Trong cuốn sách The Design and Evolution of C++ ISBN 0-201-54330-3, Bjarne Stroustrup đã trình bày các nguyên tắc thiết kế ngôn ngữ C++. Hiểu rõ các nguyên tắc này sẽ giúp giải thích tại sao C++ có những đặc điểm riêng biệt. Dưới đây là tóm tắt các nguyên tắc chính (chi tiết có thể tham khảo trong sách).
- C++ là ngôn ngữ đa mô hình, kiểu tĩnh nhưng vẫn giữ được hiệu năng và linh hoạt như C
- Hỗ trợ đầy đủ nhiều phương pháp lập trình: thủ tục, hướng đối tượng, tổng quát và trừu tượng dữ liệu
- Trao quyền lựa chọn cho lập trình viên, kể cả khi có thể dẫn đến sai lầm
- Đảm bảo tương thích tối đa với C để dễ dàng chuyển đổi từ C sang
- Tránh các tính năng phụ thuộc nền tảng cụ thể hay mục đích quá chuyên biệt
- Không yêu cầu các công cụ hỗ trợ phức tạp
- Có thể hoạt động trong môi trường phát triển đơn giản
Tài liệu tham khảo:
- Inside the C++ Object Model của Stanley B. Lippman - người phát triển C-front (phiên bản C++ đầu tiên tại Bell Labs). Cuốn sách phân tích cách trình biên dịch C++ tổ chức bộ nhớ và xử lý các câu lệnh.
Hành trình phát triển C++
Năm 1979, Stroustrup bắt đầu nghiên cứu khái niệm lớp khi nhận thấy Simula có ưu điểm cho phát triển phần mềm lớn nhưng chạy chậm, trong khi BCPL nhanh nhưng thiếu tính trừu tượng. Khi làm việc tại Bell Labs, ông đã kết hợp ưu điểm của cả hai vào C - ngôn ngữ nhanh và phổ biến. Phiên bản đầu tiên ra mắt tháng 11/1985 với các tính năng mới: lớp, kế thừa, kiểm tra kiểu chặt, hàm inline và tham số mặc định.
Năm 1983, ngôn ngữ đổi tên từ C với các lớp thành C++. Các tính năng đột phá được bổ sung gồm: hàm ảo, nạp chồng, tham chiếu, hằng số, quản lý bộ nhớ động, kiểm soát kiểu chặt hơn và cú pháp chú thích //.
Năm 1985 chứng kiến sự ra đời của cuốn sách The C++ Programming Language, trở thành tài liệu tham khảo then chốt dù chưa phải là chuẩn chính thức.
Phiên bản C++ 2.0 phát hành năm 1989 mang đến nhiều cải tiến đáng kể: hỗ trợ đa kế thừa, lớp trừu tượng, phương thức tĩnh, phương thức hằng và thành viên protected.
Năm 1990, The Annotated C++ Reference Manual ra mắt, đặt nền móng cho các tiêu chuẩn sau này.
Các bản cập nhật tiếp theo giới thiệu template, xử lý ngoại lệ, namespace, toán tử new ép kiểu và kiểu dữ liệu bool.
Thư viện chuẩn C++ phát triển song song với ngôn ngữ. Khởi đầu với iostream.h thay thế các hàm C như printf, sau đó mở rộng với Thư viện Template Chuẩn (STL) - một trong những bổ sung quan trọng nhất.
Sau quá trình hợp tác kéo dài giữa ANSI và ISO, tiêu chuẩn ISO/IEC 14882:1998 chính thức được công bố vào năm 1989. Các bản sửa lỗi tiếp theo được phát hành vào năm 2003 sau khi xử lý các vấn đề được báo cáo.
C++ là ngôn ngữ mã nguồn mở và miễn phí sử dụng, tuy nhiên các tài liệu tiêu chuẩn hóa chính thức thì không miễn phí.
Định hướng phát triển tương lai
C++ không ngừng phát triển để đáp ứng nhu cầu mới. Nhóm Boost.org đóng vai trò quan trọng trong việc đề xuất các cải tiến cho Hội đồng Tiêu chuẩn C++. Xu hướng hiện nay cho thấy C++ ngày càng đa năng hơn, đặc biệt trong lĩnh vực metaprogramming. Mặc dù chuẩn C++ không quy định cách triển khai name decoration hay xử lý ngoại lệ, nhưng vẫn có các chuẩn riêng cho từng nền tảng cụ thể.
Cho đến năm 2004, nhiều trình biên dịch vẫn chưa hỗ trợ đầy đủ chuẩn C++, đặc biệt là tính năng template. Từ khóa export - cho phép tách biệt định nghĩa template với khai báo - chỉ được hỗ trợ bởi Comeau C++ (2003) và Borland C++ Builder X (2004). Các trình biên dịch phổ biến như Microsoft Visual C++ và GCC không hỗ trợ tính năng này. Mặc dù có đề xuất loại bỏ export khỏi chuẩn tương lai, nhưng cuối cùng nó vẫn được giữ lại.
Trong nhiều năm sau khi chuẩn C++ ra đời, các tính năng template như chuyên biệt hóa từng phần vẫn được hỗ trợ rất hạn chế bởi các trình biên dịch.
Nguồn gốc tên gọi C++
Tên C++ được Rick Mascitti đặt vào giữa năm 1983 và chính thức sử dụng từ tháng 12/1983. Trước đó, ngôn ngữ này được biết đến với cái tên "C với các lớp". Toán tử ++ (tăng giá trị lên 1) được thêm vào chữ C để thể hiện sự phát triển vượt bậc từ ngôn ngữ C. Tương tự, C# (4 dấu +) là phiên bản nâng cao hơn nữa. Stroustrup giải thích:
Tên C++ phản ánh quá trình phát triển tự nhiên từ C. C+ là tên một ngôn ngữ cũ không liên quan đến C hay C++.
C++ không đơn thuần là phiên bản mở rộng của C
Mặc dù nhiều đoạn mã C có thể chạy được trên C++ mà không cần sửa đổi, nhưng vẫn tồn tại những khác biệt quan trọng khiến C++ không phải là phiên bản mở rộng đơn thuần của C. Ví dụ, C++ cấm gọi hàm main từ trong chương trình - điều vốn hợp lệ trong C. Ngoài ra, C++ có những hạn chế chặt chẽ hơn như: không cho phép ép kiểu ngầm định giữa các con trỏ không liên quan và yêu cầu khai báo hàm trước khi sử dụng.
Một vấn đề thường gặp khi chuyển từ C sang C++ là sự xuất hiện của nhiều từ khóa mới trong C++, khiến một số định danh trong C trở thành không hợp lệ. Ví dụ điển hình:
struct template { int new; struct template *class; };
đoạn mã này hợp lệ trong C nhưng không thể biên dịch trong C++ do template, new và class đã trở thành từ khóa.
Sự khác biệt còn thể hiện ở cách khai báo. Nhiều cú pháp khai báo kiểu cũ trong C không còn được chấp nhận trong C++.
int subtract(minuend, subtrahend) int minuend; int subtrahend; { return minuend - subtrahend; }
Theo chuẩn C++ hiện đại, cần viết lại thành:
int subtract(int minuend, int subtrahend) { return minuend - subtrahend; }
Mẫu code minh họa C++
Ví dụ cơ bản
Dưới đây là hai chương trình C++ cơ bản nhất, tuy không thực hiện chức năng cụ thể nhưng vẫn hợp lệ về mặt cú pháp:
#include<iostream> int main() { return 0; }
Trong nhiều trường hợp, việc nhận tham số dòng lệnh khi khởi chạy chương trình là cần thiết:
int main(int argc, char *argv[]) { return 0; }
argc lưu số lượng tham số dòng lệnh, trong khi argv là mảng các chuỗi chứa các tham số này.
Chú ý quan trọng:
- Theo chuẩn C++, hàm main bắt buộc phải trả về kiểu int. Việc sử dụng kiểu trả về khác sẽ không tuân thủ tiêu chuẩn.
- Mặc dù chuẩn C++ cho phép bỏ qua lệnh return (khi đó giá trị 0 sẽ được trả về mặc định), nhiều trình biên dịch vẫn yêu cầu phải có lệnh return tường minh và sẽ báo lỗi nếu thiếu.
Chương trình Hello World
Ví dụ kinh điển Hello World sử dụng đối tượng cout từ thư viện chuẩn để xuất thông điệp ra màn hình.
#include <iostream> // Khai báo thư viện nhập/xuất using namespace std; // Sử dụng namespace std int main() { cout << "Hello World!" << endl; }
Nhập xuất dữ liệu cơ bản
Xem ví dụ minh họa sau:
Chương trình này hiển thị câu hỏi, nhận phản hồi từ người dùng qua biến response, sau đó dùng câu lệnh if để xử lý và hiển thị kết quả tương ứng.
Lập trình template
C++ cho phép kết hợp nhiều phương pháp lập trình khác nhau. Ví dụ dưới đây minh họa cách sử dụng lập trình template - một trong những mô hình mạnh mẽ của C++:
C++ hiện đại giúp đơn giản hóa các tác vụ phức tạp thông qua Thư viện Chuẩn. Ví dụ sau sử dụng container map và vector để quản lý dữ liệu:
#include<iostream> // Xuất dữ liệu #include<vector> // Vector container #include<map> // Map container #include<algorithm> // Thuật toán #include<string> // Xử lý chuỗi using namespace std; void display_items(pair<string const, vector<string>> const& person) { cout << person.first << " có " << person.second.size() << " món đồ" << endl; } int main() { map<string, vector<string>> items; items["Anya"].push_back("khăn quàng"); items["Dimitri"].push_back("vé"); items["Anya"].push_back("cún con"); for_each(items.begin(), items.end(), display_items); return 0; }
Lập trình hướng đối tượng

Ghi chú quan trọng:
- Mã nguồn được hiển thị bằng màu đen, phần giải thích về OOP bằng màu khác
- Lớp (class) chỉ là kiểu dữ liệu trừu tượng, cần được khởi tạo (instantiate) thành đối tượng cụ thể. Ví dụ: Inherit1 boy; tạo đối tượng boy từ lớp Inherit1
- C++ cung cấp đầy đủ tính năng OOP, ví dụ này chỉ minh họa những khái niệm cơ bản
- Cú pháp C++
- Thư viện tiêu chuẩn C++
- Ngôn ngữ C
- Tiêu chuẩn C++11
- Ngôn ngữ C#
- Mẫu thiết kế phần mềm
- Công cụ Dev-C++
- Bộ dịch GNU
- Hàm inline
- Lập trình metaprogramming
- Thuật ngữ tin học
- Lập trình OOP
- Visual C++ IDE
- Ngôn ngữ Javascript
- Đặng Ngọc Hoàng Thành: Lập trình OOP với C++, 2011
- BSI: Tiêu chuẩn C++, Wiley, ISBN 0-470-84674-7
- Bjarne Stroustrup: Ngôn ngữ lập trình C++, Addison-Wesley, ISBN 0-201-70073-5
- Bjarne Stroustrup: Thiết kế và tiến hóa của C++, Addison-Wesley, ISBN 0-201-54330-3
- Nicolai Josuttis: Thư viện chuẩn C++, Addison-Wesley, ISBN 0-201-37926-0
- David Vandevoorde: C++ Templates toàn tập, Addison-Wesley, ISBN 0-201-70073-5
- Scott Meyers: Effective C++ - 50 cách cải thiện chương trình, Addison-Wesley, ISBN 0-201-92488-9
- Scott Meyers: More Effective C++ - 35 phương pháp nâng cao, Addison-Wesley, ISBN 0-201-63371-X
- Scott Meyers: Effective STL, Addison-Wesley, ISBN 0-201-74962-9
- Andrei Alexandrescu: Thiết kế C++ hiện đại, Addison-Wesley, ISBN 0-201-70431-5
- Herb Sutter: Chuẩn coding C++, Addison-Wesley, ISBN 0-321-11358-6
- David Abrahams: Metaprogramming với C++, Addison-Wesley, ISBN 0-321-22725-5
- Herb Sutter: Phong cách C++, Addison-Wesley, ISBN 0-201-76042-8
- Andrew Koenig: Suy ngẫm về C++, Addison-Wesley, ISBN 0-201-42339-1
- Andrew Koenig: Học C++ nhanh, Addison-Wesley, ISBN 0-201-70353-X
- Matthew Wilson: C++ không hoàn hảo, Addison-Wesley, ISBN 0-321-22877-4
- James Coplien: C++ nâng cao, ISBN 0-201-54855-0
- James Coplien: Đa mẫu hình trong C++, Addison-Wesley, ISBN 0-201-82467-1
- John Lakos: Thiết kế phần mềm C++ lớn, Addison-Wesley, ISBN 0-201-63362-0
- Stephen Dewhurst: C++ Gotchas, Addison-Wesley, ISBN 0-321-12518-5
- D. S. Malik: Lập trình C++, Course Technology, ISBN 0-619-06213-4
- Ivor Horton: C++ ANSI cơ bản, Apress, ISBN 1-59059-227-1
- Siva Challa: Managed Extensions cho C++, Apress, ISBN 1-893115-28-3
- John Viega: Lập trình an toàn với C/C++, O'Reilly, ISBN 0-596-00394-3
- Steve Oualline: Cách không nên lập trình C++, No Starch, ISBN 1-886411-95-6
- Steve Oualline: Lập trình C++ thực hành, O'Reilly, ISBN 0-596-00419-2
- Michi Henning: Lập trình CORBA với C++, Addison-Wesley, ISBN 0-201-37927-9
- Cameron Hughes: Lập trình song song với C++, Prentice Hall, ISBN 0-13-101376-9
- Adam Drozdek: Cấu trúc dữ liệu C++, Course Technology, ISBN 0-534-37597-9
- Larry Nyhoff: CTDL và giải thuật C++, Addison-Wesley, ISBN 0-13-132794-1
- Paul Deitel: C++ đơn giản, Prentice Hall, ISBN 0-13-127768-5
- Paul Whitehead: Học C++, O'Reilly, ISBN 0-596-00437-0
- Stanley Lippman: C++ cốt lõi, Addison Wesley, ISBN 0-201-48518-4
Tài nguyên bên ngoài
- Trang chủ Bjarne Stroustrup
- C++ FAQ Lite của Marshall Cline
- C++ Style và Technique FAQ của Bjarne Stroustrup
Tài liệu hướng dẫn
- Tài liệu tham khảo thư viện C++ từ Dinkumware Lưu trữ ngày 14/9/2005 tại Wayback Machine
- Hướng dẫn lập trình STL từ SGI
- Tài liệu tham khảo C/C++
- Ngữ pháp C++ dạng BNF có liên kết
Công cụ biên dịch
- Trình biên dịch miễn phí của Borland Lưu trữ ngày 16/5/2006 tại Wayback Machine
- Digital Mars C++
- Bộ biên dịch GNU (bao gồm g++)
- Trình biên dịch C++ .NET miễn phí từ Microsoft
Tài liệu học tập
- Giáo trình C++ hướng đối tượng của Ths Hoàng Thành
- Sách điện tử Programming:C++ (1) trên Wikibook
- Sách điện tử Programming:C++ (2) trên Wikibook
- How to Think Like a Computer Scientist Lưu trữ ngày 29/10/2005 - phiên bản C++
- Sách miễn phí "Tư duy C++" Lưu trữ ngày 27/11/2011 của Bruce Eckel
- Sách miễn phí "C++: Đối thoại" Lưu trữ ngày 30/10/2005 của Steve Heller
- Computer-Books.us Lưu trữ ngày 3/11/2005 - Bộ sưu tập sách C++ trực tuyến
Tài nguyên học tập
- Hướng dẫn lập trình C++ - CoderSource.net
- Khóa học C++ miễn phí Lưu trữ ngày 1/11/2005
- Hướng dẫn C++ toàn diện từ About.com Lưu trữ ngày 13/10/2005
- Tài liệu C++ trên GNAcademy.Org Lưu trữ ngày 18/10/2005
- C++ Annotations
Thông tin tiêu chuẩn
- Trang ủy ban tiêu chuẩn: JTC1/SC22/WG21 - C++
- Bản nháp cũ của tiêu chuẩn C++
- Kiểm tra trình biên dịch C++ theo chuẩn ISO Lưu trữ ngày 27/4/2006
Thư viện và tài liệu liên quan
- Boost.org: Bộ thư viện C++ chất lượng cao
- Thư viện biến đổi văn bản thông dụng
- Kho mã nguồn Planet Source Lưu trữ ngày 28/6/2015 với hàng ngàn mẫu code
- Cơ sở dữ liệu phân cấp Mumps Lưu trữ ngày 30/8/2006
Trang web liên quan
- Bách khoa lập trình CodePedia Lưu trữ ngày 22/9/2013
- CProgramming.com
- Code Project
Cộng đồng thảo luận
- Cộng đồng học C++ Lưu trữ ngày 7/1/2007 - Diễn đàn chuyên sâu về ngôn ngữ C++
- Diễn đàn C++ tại Cprogramming.com
- Chuyên mục C/C++ trên Daniweb
- Diễn đàn C++ Home Lưu trữ ngày 22/9/2005 tại cpp-home.com
Tạp chí chuyên ngành
- Tạp chí dành cho lập trình viên C/C++ [3]
Diễn đàn cộng đồng
- Hiệp hội người dùng C và C++ (ACCU)
Các nguồn khác
- Diễn đàn thảo luận C2.com
- Công cụ phân tích cú pháp C++
- Trang chủ Embedded C++
- Hướng dẫn chuyển đổi từ Borland C++ sang chuẩn ISO/ANSI C++ dành cho nhà phát triển
- Trình thông dịch Ch Lưu trữ ngày 1/12/2005 - hỗ trợ tập con ngôn ngữ C++
- Tài liệu C++/CLI bởi Stanley B. Lippman
- Kênh ##C++ trên freenode Lưu trữ ngày 15/12/2005
- Bài viết "Khác biệt giữa chuẩn C và C++" của David R. Tribble
- Các nhóm tin: "comp.lang.c++", "comp.lang.c++.moderated", "comp.std.c++"
- Danh mục phân loại các tài nguyên C++ hữu ích
- Tổng hợp liên kết C++ từ Đại học Cambridge Lưu trữ ngày 30/10/2005
- Kho mã nguồn mẫu C++
Ngôn ngữ lập trình | |
---|---|
Dùng cho kỹ nghệ |
|
Dùng trong giảng dạy |
|
Có giá trị lịch sử |
|