【C++】C++11右值引用|新增默认成员函数|可变参数模版|lambda表达式
发布人:shili8
发布时间:2025-03-15 14:19
阅读次数:0
**C++11新特性**
C++11是C++语言的第一个重大更新版本,于2011年发布。它引入了许多新的特性和改进,使得编程更加高效、安全和易用。在本文中,我们将重点介绍四个重要的新特性:右值引用、新增默认成员函数、可变参数模版和lambda表达式。
###1. 右值引用在C++11之前,右值(如临时对象)不能被赋值给左值(如变量)。这导致了许多不必要的拷贝或移动操作。右值引用是解决这个问题的关键。
**右值引用定义**
cpptemplate <typename T> T&& get(T& t) { return std::move(t); }
在上面的例子中,`get`函数返回一个右值引用,它可以绑定到任何类型的左值或右值。`std::move`函数用于将左值转换为右值。
**使用示例**
cppint main() { int a =5; auto&& b = get(a); // b 是一个右值引用,绑定到 a 的拷贝 std::cout << b << std::endl; // 输出5 int c =10; auto&& d = get(c); // d 是一个右值引用,绑定到 c 的拷贝 std::cout << d << std::endl; // 输出10 return0; }
在上面的示例中,我们使用`get`函数将左值 `a` 和 `c` 转换为右值,然后使用右值引用绑定到它们的拷贝。
###2. 新增默认成员函数C++11引入了一个新特性:新增默认成员函数。这个特性允许类定义一个或多个成员函数作为其所有子类的默认实现。
**示例**
cppclass Base { public: virtual void print() =0; // pure virtual function}; class Derived : public Base { public: void print() override { std::cout << "Derived" << std::endl; } // default implementation};
在上面的例子中,我们定义了一个基类 `Base`,它包含一个纯虚函数 `print()`。然后我们定义了一个派生类 `Derived`,它重载了 `print()` 函数并提供了一个默认实现。
###3. 可变参数模版C++11引入了可变参数模版(variadic templates),允许模版函数或类接受任意数量的参数。
**示例**
cpptemplate <typename... Args> void print(Args&&... args) { for (auto&& arg : {args...}) { std::cout << arg << " "; } } int main() { print("Hello",123,456.789); // 输出 Hello123456.789 return0; }
在上面的例子中,我们定义了一个模版函数 `print`,它接受任意数量的参数。然后我们使用这个函数打印出多个值。
###4. lambda表达式C++11引入了lambda表达式(lambda expressions),允许定义小型匿名函数。
**示例**
cppauto add = [](int a, int b) { return a + b; }; // lambda 表达式std::cout << add(3,4) << std::endl; // 输出7
在上面的例子中,我们定义了一个lambda表达式 `add`,它接受两个整数并返回它们的和。然后我们使用这个函数计算出两个数字的和。
以上就是C++11四个重要新特性的介绍。这些特性使得编程更加高效、安全和易用。