C++11 (C++2.0)笔记 一

简介: C++11 (C++2.0)笔记 一

Variadic Templates    数量不定的模板参数

针对函数:

这种特性可以用来递归调用。这个递归的作用是把不定个数的参数 一 一 分解 。 当我们在使用这个模板特性的时候一定要写一个处理最后一种情况的东西,在这里是一个函数 print() 。因为最后一次递归调用的时候参数为空。

c++11之后模板参数的尖括号可以写到一起了(编译器变得越来越智能)

nullptr 和 nullptr_t

auto

Uniform Initialization

Initializer_List<>  

编译器看到{}之后会调用initializer_list的构造函数,传进去两个参数,一个array的头部和一个大小,事实上编译器在调用构造函数之前已经准备好了一个array。

initializer_list对象只是引用了array的第一个元素,指向他,并不是把整包东西传递进去,再进行拷贝的时候,也是只创建了一个新的iterator指向同一个array,浅拷贝。

标准库新增的版本,     min 和 max 都可以接收任意个数的参数进行比较。

explicit for ctors taking more than one argument

c++2.0之前  :   explicit 告诉编译器不要自作聪明帮我做构造函数的隐士转换, 要在我明确调用构造函数的时候才使用。    2.0之前只可以提供单一的参数,2.0之后可以提供多个参数的版本。  本质都是不希望编译器帮我们做隐士类型转换。

range based for statement   (for循环的特殊写法)

利用迭代器将coll(容器)里的元素一个一个的取出来赋值到decl身上,然后执行statement。

如果两边类型不一致编译器会进行类型转换。

c++2.0有两个函数 begin()和end()是可以直接接收容器的

=default , =delete

一个类如果带有指针成员, 那么一定要自己定义big three,如果是普通成员则大多数都不需要自己写出。

Alias Template(template typedef)   模板别名

使用iterator_traits萃取器将容器的迭代器传进去有一个value_type函数可以得到容器的类型。

template template parameter  模板模板参数

当你将一个模板当作参数传递给另一个模板时,编译器没有办法知道你的第二个参数有默认值,而且第二个参数的类型依赖第一个参数。

使用alias  template 可以解决这个问题。

Type Alias (similar to typedef)

using 多种用法

noexcept

保证这个函数不抛出异常,但是是可以有先决条件的 noexcept(  true ) 。

如果你的class里面有move function ,一定要注意不要抛出异常,写上noexcept让编译器放心的调用你,也让使用者放心的使用。

override   复写,改写  应用到虚函数身上

当你要复写虚函数的时候,告诉编译器,把你的心意告诉它,我就是要复写虚函数,帮助编译器帮你检查错误。

final

第一种用法:  放在类里面,告诉编译器,我就是继承体系下的最后一个类final,不能再继承我了。让有类继承我的时候,就会报错。

第二种用法:  针对虚函数。     意思是这个虚函数不允许被复写。

decltype        

第一种应用:   宣告一个返回值类型。  返回类型后置。

第二种用法:适用于原编程。

模板只是一个半成品,具体能不能用还得看二次编译后的情况。

第三种用法:

Lambdas

lambdas 本质是个对象(可以想象成一个函数对象) , 加小括号调用lambdas表达式。  auto l 意思是我先把这个lambdas记录起来  ,  然后   l()    调用它。     上面那个lambdas 只可以调用一次,下面这个可以多次调用。   当你只是临时想到一些东西的时候可以直接写出来,不必做成函数调用的形式。

如果那三个可选项写了一个以上,那小括号就一定要写。否则可以不写小括号。

如果是按值捕获,想要修改的话要加上mutable。

lamdbas没有默认构造函数, 如果给一个容器指定了lambdas的比较器,那么在定义这个容器的对象的时候也要把lambdas作为参数传递给这个容器。  lambdas是内联的

目录
相关文章
|
6月前
|
编译器 C语言 C++
C++一分钟之-C++11新特性:初始化列表
【6月更文挑战第21天】C++11的初始化列表增强语言表现力,简化对象构造,特别是在处理容器和数组时。它允许直接初始化成员变量,提升代码清晰度和性能。使用时要注意无默认构造函数可能导致编译错误,成员初始化顺序应与声明顺序一致,且在重载构造函数时避免歧义。利用编译器警告能帮助避免陷阱。初始化列表是高效编程的关键,但需谨慎使用。
75 2
|
6月前
|
算法 C++
算法笔记:递归(c++实现)
算法笔记:递归(c++实现)
|
7月前
|
存储 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(下)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
115 5
|
6月前
|
编译器 C++
《Effective C++ 改善程序与设计的55个具体做法》 第一章 笔记
《Effective C++ 改善程序与设计的55个具体做法》 第一章 笔记
|
4月前
|
C++ 容器
【C/C++笔记】迭代器
【C/C++笔记】迭代器
33 1
|
4月前
|
存储 安全 程序员
【C/C++笔记】迭代器范围
【C/C++笔记】迭代器范围
75 0
|
5月前
|
C++ Windows
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
在Windows上使用Visual Studio 2022进行FFmpeg和SDL2集成开发,首先安装FFmpeg至E:\msys64\usr\local\ffmpeg,然后新建C++控制台项目。在项目属性中,添加FFmpeg和SDL2的头文件及库文件目录。接着配置链接器的附加依赖项,包括多个FFmpeg及SDL2的lib文件。在代码中引入FFmpeg的`av_log`函数输出"Hello World",编译并运行,若看到"Hello World",即表示集成成功。详细步骤可参考《FFmpeg开发实战:从零基础到短视频上线》。
251 0
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
|
4月前
|
存储 程序员 C++
【C++小知识】基于范围的for循环(C++11)
【C++小知识】基于范围的for循环(C++11)
|
4月前
|
编译器 C语言 C++
【C++关键字】指针空值nullptr(C++11)
【C++关键字】指针空值nullptr(C++11)
|
4月前
|
存储 编译器 C++
【C++关键字】auto的使用(C++11)
【C++关键字】auto的使用(C++11)