Logo

历史

让我们来看看C++这些年来的演变历程。

概念

历史

让我们来看看C++这些年来的演变历程。

C++98

C++ 的开发始于 1985 年。然而,该语言直到 1998 年才正式标准化,因此最初的版本被称为 C++98。

尽管与如今的功能相比显得较为基础,C++98 已经支持基本的输入输出流和模板。标准库(STL)包含了字符串、算法以及容器(如数组、队列、栈等)等功能。

与结构化和过程式编程语言 C 不同,C++ 最初更侧重于面向对象编程:

1#include <iostream> 2 3class HumanBeing { 4public: 5 HumanBeing(std::string n): name(n) {} 6 std::string getName() const { 7 return name; 8 } 9 void changeName(const std::string& newName) { 10 name = newName; 11 } 12private: 13 std::string name; 14}; 15 16class Man : public HumanBeing { 17 using HumanBeing::HumanBeing; 18public: 19 std::string getSex() const { 20 return "male"; 21 } 22}; 23 24class Woman : public HumanBeing { 25 using HumanBeing::HumanBeing; 26public: 27 std::string getSex() const { 28 return "female"; 29 } 30}; 31 32int main() { 33 Man man("Rainer"); 34 std::cout << "Name: " << man.getName() << std::endl; 35 man.changeName("Rainer Grimm"); 36 std::cout << "New name: " << man.getName() << std::endl; 37 std::cout << "Sex: " << man.getSex() << std::endl; 38}

C++ 还通过模板引入了泛型特性:

1template <typename T> 2void xchg(T& x, T& y) { 3 T t = x; 4 x = y; 5 y = t; 6} 7 8template <typename T, int N> 9class Array { 10public: 11 int getSize() const { 12 return N; 13 } 14private: 15 T* elem[N]; 16}; 17 18int main() { 19 // 使用第一个模板 20 int i = 10; 21 int j = 20; 22 std::cout << "i = " << i << ", j = " << j << std::endl; 23 24 xchg(i, j); 25 std::cout << "i = " << i << ", j = " << j << std::endl; 26 27 Man huber("Huber"); // Man 类已定义 28 Man maier("Maier"); 29 std::cout << huber.getName() << ", " << maier.getName() << std::endl; 30 xchg(huber, maier); 31 std::cout << huber.getName() << ", " << maier.getName() << std::endl; 32 33 // 使用第二个模板 34 Array<double, 10> doubleArray; 35 std::cout << doubleArray.getSize() << std::endl; 36 37 Array<Man, 5> manArray; 38 std::cout << manArray.getSize() << std::endl; 39}

C++11

随着 C++11 的推出,语言的重点转向了函数式编程。这一版本引入了许多新特性,使语言得到了显著演进。部分重要特性包括:

  • 共享指针和独占指针
  • 空指针
  • 自动类型推导
  • Lambda 表达式

以下是一个 Lambda 函数与自动类型推导的示例:

1#include <iostream> 2#include <vector> 3#include <numeric> 4#include <algorithm> 5#include <functional> 6 7int main() { 8 std::vector<int> vec{1, 2, 3, 4, 5, 6, 7, 8, 9}; 9 std::vector<std::string> str{"Programming", "in", "a", "functional", "style."}; 10 11 std::accumulate(vec.begin(), vec.end(), 1, [](int a, int b) { return a * b; }); // 362880 12 13 std::accumulate(str.begin(), str.end(), std::string{}, 14 [](std::string a, std::string b) { return a + ":" + b; }); 15 // "Programming:in:a:functional:style." 16 17 std::transform(vec.begin(), vec.end(), vec.begin(), 18 [](int i) { return i * i; }); // {1, 4, 9, 16, 25, 36, 49, 64, 81} 19 20 auto it = std::remove_if(vec.begin(), vec.end(), 21 [](int i) { return (i < 3) || (i > 8); }); // {3, 4, 5, 6, 7, 8} 22 23 auto it2 = std::remove_if(str.begin(), str.end(), 24 [](std::string s) { return std::islower(s[0]); }); // "Programming" 25}

时间线

...
时间线图示

更多信息

  • 共享指针
  • 独占指针
  • 空指针
  • 自动类型推导
  • Lambda 表达式

在下一章中,我们将学习如何使用 字面量。

字面量