Ngôn ngữ lập trình C++ có lịch sử hình thành từ năm 1979, khi Bjarne Stroustrup đang nghiên cứu luận văn Tiến sĩ. Một trong những ngôn ngữ mà Stroustrup có cơ hội tiếp cận tên là Simula, như tên gọi của nó, được thiết kế chủ yếu để giả lập. Ngôn ngữ Simula 67– phiên bản mà Stroustrup đã nghiên cứu – được coi là ngôn ngữ đầu tiên hỗ trợ các mô hình hướng đối tượng. Stroustrup khám phá ra là mô hình này rất hữu ích cho ngành phát triển phần mềm, song ngôn ngữ Simula có nhược điểm là quá chậm so với yêu cầu thực tế.
Ngay sau đó, ông bắt đầu làm việc trên “C với các Class (C with Classes)”, ngôn ngữ mà như cái tên của nó đã ngụ ý là một tập hợp cao hơn từ ngôn ngữ C. Mục tiêu của ông là thêm tính hướng đối tượng vào ngôn ngữ C, ngôn ngữ vẫn có thế mạnh bởi tính di dộng của mình mà không mất đi các chức năng cấp thấp. Ngôn ngữ của ông bao gồm các class, khả năng kế thừa đơn giản, nội tuyến (inlining), các hàm có đối số mặc định và khả năng kiểm tra kiểu mạnh mẽ (strong type checking) bên cạnh các tính năng sẵn có của C.
Trình biên dịch “C với các Class (C with Classes)” đầu tiên có tên là Cfront, xuất phát từ một trình biên dịch C có tên là “CPre”. Đó là một chương trình thiết kế nhằm chuyển đổi code “C với các Class” sang ngôn ngữ C ban đầu. Điểm đáng chú ý ở đây là Cfront được viết chủ yếu bằng “C với các Class”, biến nó trở thành một trình biên dịch self-hosting (trình biên dịch có thể tự biên dịch chính nó). Cfront về sau bị bãi bỏ vào năm 1993 khi nó trở nên khó tích hợp các tính năng mới, cụ thể như với các ngoại lệ (exception) C++. Tuy nhiên Cfront thực sự đóng vai trò lớn trong việc phát triển các trình biên dịch về sau và trên hệ điều hành Unix.
Vào năm 1983, tên của ngôn ngữ này (C với các Class) đổi sang thành “C++” Toán tử ++ trong ngôn ngữ C là một toán tử tăng giá trị một biến, mang đến cho Stroustrup cái nhìn sâu sắc về ngôn ngữ này. Nhiều tính năng mới cũng được bổ sung trong khoảng thời gian này, đáng chú ý nhất là các hảm ảo (virtual), hàm overloading, tham chiếu với ký tự &, const keyword, comment trên một dòng sử dụng 2 dấu “//” ( được thêm vào từ ngôn ngữ BCPL).
Năm 1985, tài liệu tham khảo của Stroustrup có tên là The C++ Programming Language được xuất bản. Cùng năm đó, C++ cũng phát hành phiên bản thương mại. Lúc đó ngôn ngữ này vẫn chưa được chuẩn hoá chính thức, nên tài liệu này là nguồn tham khảo chủ yếu. Ngôn ngữ C++ được cập nhập một lần nữa vào năm 1989 bao gồm các thành phần protected và static, cùng với việc kế thừa từ nhiều class.
Năm 1990, tài liệu The Annotated C++ Reference Manual được phát hành. Cũng trong năm đó, trình biên dịch Turbo C++ của Borland phát hành bản thương mại. Turbo C++ thêm vào nhiều thư viện bổ sung, có tác động lớn đối với sự phát triển của C++. Mặc dù phiên bản ổn định cuối cùng của Turbo C++ được phát hành vào năm 2006, nhưng hiện nay trình biên dịch này vẫn được sử dụng rất rộng rãi.
Năm 1998, hội đồng chuẩn hoá C++ công bố tiêu chuẩn quốc tế đầu tiên cho ngôn ngữ này: ISO/IEC 14882:1998, được biết đến với cái tên phổ biến hơn là C++98. The Annotated C++ Reference Manual đóng góp phần lớn vào sự phát triển của tiêu chuẩn này. The Standard Template Library – ý tưởng được hình từ những năm 1979 cũng được giới thiệu. Năm 2003, hội đồng giải đáp các vấn đề được báo cáo từ tiêu chuẩn 1998 và xem xét lại một cách cẩn thận. Ngôn ngữ cập nhật thay đổi này có tên là C++03.
Năm 2005, hội đồng chuẩn hoá C++ công bố báo cáo kỹ thuật (gọi là TR1) nêu chi tiết rất nhiều tính năng mà họ đang lên kế hoạch để bổ sung và chuẩn C++ mới nhất. Chuẩn mới này được đặt tên không chính thức là C++0x , vì được kỳ vọng sẽ tung ra trước khi kết thúc thập kỷ đầu tiên. Trớ trêu thay, chuẩn mới này bị hoãn lại cho đến giữa năm 2011. Thời điểm đó, một số báo cáo kỹ thuật đã được phát hành, và một số trình biên dịch bắt đầu bổ sung thêm sự hỗ trợ các tính năng mới mang tính thử nghiệm.
Giữa năm 2011, chuẩn C++ mới (có tên là C++11) đã hoàn tất. Dự án thư viện Boost đóng một vai trò lớn trong chuẩn mới này, các module mới có dẫn xuất trực tiếp từ thư viện Boost tương ứng. Một vài tính năng mới bao gồm hỗ trợ biểu thức chính quy (chi tiết ở đây), một thư viện ngẫu nhiên hoàn toàn, một thư viện C++ time mới, hỗ trợ atomics, một thư viện chuẩn threading (mà cho đến 2011 cả C và C++ đều thiếu), một cú pháp vòng lặp mới cung cấp chức năng tương tự như các vòng lặp foreach trong một số ngôn ngữ khác, auto keyword, các lớp container mới, hỗ trợ tốt hơn cho các union và array-initialization list và các templates.
Techtalk via Techmaster