c++11新特性

简介: c++11新特性

Variadic TempLates(数量不定的模板参数): ...(可以很方便的完成函数递归调用)

...就是一个所谓的pack;

用于模板参数,就是模板参数包;

用于函数参数类型,就是函数参数类型包;

用于函数参数,就是函数参数包。

注意:要特别处理承参数为0个的情况

sizeof...(args):参数个数

void print(){
}
template <typename T, typename...Types>
void print(const T& firstArg,const Types&... args){
}

模板表达式中的空格:

c++11后空格有无都无所谓,c++11前必须要有。

nullptr和std::nullptr_t:

c++11允许使用nullptr替代0或者NULL作为无值指针的结果,这种新特性避免了null指针被解释为整形值的错误发生。

nullptr是一个关键字,包含了nullptr_t.

auto:

c++11中允许使用auto声明一个不用指出具体类型的变量或者对象,编译器自己会做实参推导,在类型特别长和复杂的时候特别有用,简单类型的不建议用,因为耗时较长。

一致性初始化:

C++11引入了一致性初始化(Uniform Initialization)的新特性,这个特性允许你使用一种统一的语法来初始化各种不同类型的变量,包括基本数据类型、类对象、数组等。一致性初始化的目标是简化和统一初始化的语法,提高代码的可读性和可维护性。

  • 使用大括号 {} 进行初始化:
int x{42};            // 初始化整数
std::string name{"John"};  // 初始化字符串
std::vector<int> numbers{1, 2, 3};  // 初始化容器
int i{};//初始化为0
int* q{};//初始化为nullptr;
  • 使用圆括号 () 进行初始化:
int y(24);                // 使用圆括号初始化整数
std::vector<double> data(10, 0.0);  // 使用圆括号初始化容器
  • 使用等号 = 进行初始化:
int z = 17;               // 使用等号初始化整数
double pi = 3.14159;      // 使用等号初始化浮点数

initializer_list:

C++中的initializer_list是一个用于传递初始化值列表的特性,它在C++11引入,并被广泛用于初始化容器、自定义类的对象和其他支持初始化列表的场合。initializer_list允许你以一种类似于数组的方式传递一组值,并可以在接收这些值的函数或构造函数中使用。以下是initializer_list的主要特性和用法:

  • 完整代码样例:
#include<iostream>
class MyVector {
public:
    MyVector(std::initializer_list<int> values) {
        data_ = new int[values.size()];
        size_ = values.size();
        int i = 0;
        for (int num : values) {
            data_[i++] = num;
        }
    }
    void show(){
        for(int i = 0 ;i<size_;++i){
            std::cout<<data_[i]<<", ";
        }
        std::cout<<std::endl;
    }
    // 其他成员函数...
private:
    int* data_;
    size_t size_;
};
void printNumbers(std::initializer_list<int> numbers) {
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
}
int main(){
    std::cout<<"hello world"<<std::endl;
    std::initializer_list<int> numbers = {1, 2, 3, 4, 5};
    std::cout << std::endl;
// 调用函数并传递初始化列表
printNumbers({1,2,3,4});
for (int num : {1, 2, 3, 4, 5}) {
    std::cout << num << " ";
}
std::cout << std::endl;
// 使用initializer_list来创建MyVector对象
MyVector vec = {1, 2, 3, 4, 5};
vec.show();
}
  • 初始化列表的语法:

使用大括号 {} 包围一组值,逗号分隔这些值,创建一个initializer_list对象。

std::initializer_list<int> numbers = {1, 2, 3, 4, 5};
  • 用途:
  1. 传递不定数量的参数给函数。
  2. 初始化STL容器,如std::vectorstd::initializer_list等。
  3. 自定义类的构造函数参数,用于初始化对象的成员。
  4. 使用范围for循环遍历初始化列表中的元素
  • 传值给函数:

initializer_list常常用于传递一组值给函数,允许函数接收不定数量的参数。例如

void printNumbers(std::initializer_list<int> numbers) {
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
}
// 调用函数并传递初始化列表
printNumbers({1, 2, 3, 4, 5});
  • 使用for循环

initializer_list通常与范围for循环一起使用,以便轻松地遍历其中的元素。

for (int num : {1, 2, 3, 4, 5}) {
    std::cout << num << " ";
}
std::cout << std::endl;
  • 自定义类型构造函数参数

可以在自定义类中使用initializer_list构造函数来接收初始化列表,并以其为对象的成员进行初始化。

#include<iostream>
class MyVector {
public:
    MyVector(std::initializer_list<int> values) {
        data_ = new int[values.size()];
        size_ = values.size();
        int i = 0;
        for (int num : values) {
            data_[i++] = num;
        }
    }
    void show(){
        for(int i = 0 ;i<size_;++i){
            std::cout<<data_[i]<<", ";
        }
        std::cout<<std::endl;
    }
    // 其他成员函数...
private:
    int* data_;
    size_t size_;
};
void printNumbers(std::initializer_list<int> numbers) {
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
}
int main(){
    std::cout<<"hello world"<<std::endl;
    std::initializer_list<int> numbers = {1, 2, 3, 4, 5};
    std::cout << std::endl;
// 调用函数并传递初始化列表
printNumbers({1,2,3,4});
for (int num : {1, 2, 3, 4, 5}) {
    std::cout << num << " ";
}
std::cout << std::endl;
// 使用initializer_list来创建MyVector对象
MyVector vec = {1, 2, 3, 4, 5};
vec.show();
}


相关文章
|
3月前
|
C语言 C++ 开发者
深入探索C++:特性、代码实践及流程图解析
深入探索C++:特性、代码实践及流程图解析
|
3月前
|
算法 数据处理 C++
【C++ 20 新特性 算法和迭代器库的扩展和泛化 Ranges】深入浅出C++ Ranges库 (Exploring the C++ Ranges Library)
【C++ 20 新特性 算法和迭代器库的扩展和泛化 Ranges】深入浅出C++ Ranges库 (Exploring the C++ Ranges Library)
451 1
|
2月前
|
编译器 C++ 开发者
C++一分钟之-C++20新特性:模块化编程
【6月更文挑战第27天】C++20引入模块化编程,缓解`#include`带来的编译时间长和头文件管理难题。模块由接口(`.cppm`)和实现(`.cpp`)组成,使用`import`导入。常见问题包括兼容性、设计不当、暴露私有细节和编译器支持。避免这些问题需分阶段迁移、合理设计、明确接口和关注编译器更新。示例展示了模块定义和使用,提升代码组织和维护性。随着编译器支持加强,模块化将成为C++标准的关键特性。
103 3
|
2月前
|
编译器 C语言 C++
C++一分钟之-C++11新特性:初始化列表
【6月更文挑战第21天】C++11的初始化列表增强语言表现力,简化对象构造,特别是在处理容器和数组时。它允许直接初始化成员变量,提升代码清晰度和性能。使用时要注意无默认构造函数可能导致编译错误,成员初始化顺序应与声明顺序一致,且在重载构造函数时避免歧义。利用编译器警告能帮助避免陷阱。初始化列表是高效编程的关键,但需谨慎使用。
39 2
|
1月前
|
数据安全/隐私保护 C++
|
2月前
|
安全 JavaScript 前端开发
C++一分钟之-C++17特性:结构化绑定
【6月更文挑战第26天】C++17引入了结构化绑定,简化了从聚合类型如`std::tuple`、`std::array`和自定义结构体中解构数据。它允许直接将复合数据类型的元素绑定到单独变量,提高代码可读性。例如,可以从`std::tuple`中直接解构并绑定到变量,无需`std::get`。结构化绑定适用于处理`std::tuple`、`std::pair`,自定义结构体,甚至在范围for循环中解构容器元素。注意,绑定顺序必须与元素顺序匹配,考虑是否使用`const`和`&`,以及谨慎处理匿名类型。通过实例展示了如何解构嵌套结构体和元组,结构化绑定提升了代码的简洁性和效率。
52 5
|
1月前
|
存储 安全 编译器
|
3月前
|
自然语言处理 编译器 C语言
【C++】C++ 入门 — 命名空间,输入输出,函数新特性
本文章是我对C++学习的开始,很荣幸与大家一同进步。 首先我先介绍一下C++,C++是上个世纪为了解决软件危机所创立 的一项面向对象的编程语言(OOP思想)。
54 1
【C++】C++ 入门 — 命名空间,输入输出,函数新特性
|
3月前
|
编译器 C语言 C++
C++的基本特性和语法
C++的基本特性和语法
46 1
|
2月前
|
C++
C++ 是一种面向对象的编程语言,它支持对象、类、继承、多态等面向对象的特性
C++ 是一种面向对象的编程语言,它支持对象、类、继承、多态等面向对象的特性