
C++11新特性
文章平均质量分 62
介绍常用的C++11新特性
画个逗号给明天"
西电机械工程学硕研一在读,记录学习过程中的问题
展开
-
C++ algorithm之shuffle函数
在C++中,shuffle是标准库<algorithm>头文件的一个算法函数,对容器中的元素进行随机重排。它使用随机数生成器来打乱元素的顺序。shuffle 是 C++ 中用于随机重排容器元素的函数。它需要指定一个随机数生成器(如mt19937)。推荐使用 shuffle 而不是已弃用的 random_shuffle。如有错误,敬请指正!!!原创 2025-02-27 23:09:33 · 339 阅读 · 0 评论 -
C++11新特性之move
在C++中,move是一个用于将对象转换为右值引用的函数模板,定义在<utility>头文件中。它的主要作用是启用移动语义,允许资源的所有权从一个对象转移到另一个对象,而不是进行深拷贝。move是C++11引入的一个重要工具,用于实现移动语义、优化资源管理。通过将对象转为右值引用,使得资源的所有权可以高效转移,从而减少不必要的拷贝操作。如有错误,敬请指正!!!原创 2025-02-25 07:00:00 · 385 阅读 · 0 评论 -
C++11新特性之enum class
enum class是C++11引入的有作用域的枚举类型。与传统的enum不同,enum class的枚举值不会隐式转化为整数,也不会污染全局命名空间。必须通过作用域解析运算符(::)来访问枚举值。enum class是C++11引入的一种强类型、有作用域的枚举类型。它的设计更加安全和清晰,更符合现代C++编程。如有错误,敬请指正!!!原创 2025-02-23 15:41:42 · 419 阅读 · 0 评论 -
C++11新特性之final
final是C++11引入的特性,用于限制类或虚函数的进一步继承或重写,旨在增强代码的安全性和可维护性。(3)优化性能:标记为final的类或虚函数可以帮助编译器进行优化,因为编译器知道它们不会被进一步拓展或重写了。final与override一起使用,以明确表明函数是重写的,但禁止进一步的重写。一个类设计完整,不需要被继承,可以用final。合理使用final,可以更好地控制类的继承层次和虚函数的行为,使代码更加健壮和易于维护。它可以增强代码的安全性和可维护性,防止意外的继承或重写。原创 2025-02-16 20:05:40 · 367 阅读 · 0 评论 -
C++11新特性之override
在没有override的情况下,如果派生类中的函数签名与基类的虚函数不匹配(例如参数类型或数量不同),编译器会将其视为一个新的函数,而不是重写基类的虚函数。override是C++11引入的特性,用于显式地表明派生类中的成员函数是重写基类中的虚函数。在派生类中重写基类的虚函数时,在函数声明后加上override关键字,如下所示。(2)提高代码可读性:明确表名派生类中的函数是重写基类的虚函数,便于理解与维护。(1)避免错误:如果派生类的函数签名与基类虚函数不符,编译器会报错。为什么引入override?原创 2025-02-16 19:45:30 · 275 阅读 · 0 评论 -
C++11新特性之别名模版
别名模版是C++11引入的一个特性,允许为模版定义别名,从而简化复杂类型名称的书写。(3)库开发:在库开发中,别名模板可以用于隐藏复杂的实现细节,提供简洁的接口。当类型名称非常复杂时,可以使用别名模版简化代码。使用有意义的别名代替复杂的类型名称,使代码更易读。(1)简化复杂类型名称:当类型名称非常复杂时,使用别名模板可以提高代码的可读性。别名模版可以带有模版参数,适合泛型编程。(2)泛型编程:在模板编程中,别名模板可以用于定义通用的类型别名。它可以简化复杂类型名称,支持模板参数,提高代码的可读性和灵活性。原创 2025-02-15 14:42:49 · 141 阅读 · 0 评论 -
C++11新特性之decltype
(3)如果 exp 是一个左值,或者被括号( )包围,那么 decltype(exp) 的类型就是 exp 的引用;(1)如果 exp 是一个不被括号( )包围的表达式,或是一个类成员访问表达式,或是一个单独的变量,那么 decltype(exp) 的类型就和 exp 一致,这是最普遍最常见的情况。decltype是C++11新增的一个关键字,与auto的功能一样,都是在编译期间推导变量类型的。(2)如果 exp 是函数调用,那么 decltype(exp) 的类型就和函数返回值的类型一致。原创 2025-01-24 22:19:44 · 771 阅读 · 0 评论 -
C++11新特性之weak_ptr智能指针
C++11虽然将weak_ptr当做智能指针,但该类型通常不单独使用,只能与shared_ptr类型指针搭配使用。通过weak_ptr指针,我们可以获取shared_ptr指针的状态信息,例如有多少个shared_ptr指向同一片堆内存,指向的堆内存是否被释放等。注意,weak_ptr指针的指向与shared_ptr指针相同时,weak_ptr指针不会使指向堆内存的引用计数加1;weak_ptr没有重载*与->运算符,因此,weak_ptr指针只能访问所指堆内存,不能修改。(1)创建weak_ptr指针。原创 2025-02-11 22:18:27 · 832 阅读 · 0 评论 -
C++11新特性(汇总)
本文主要汇总C++11的重要特性,方便大家进行学习与查询。原创 2025-02-12 11:02:58 · 570 阅读 · 0 评论 -
C++11新特性之右值引用
(1)生命周期:右值引用绑定的临时对象生命周期会被延长,知到右值引用的生命周期结束。右值引用是C++11引入的一种重要特性,它主要用于实现移动语义和完美转发,从而提高程序的性能与效率。注意,虽然 C++98/03 标准不支持为右值建立非常量左值引用,但允许使用常量左值引用操作右值。(1)位于赋值号(=)左侧的表达式是左值,反之,只能位于右侧的表达式就是右值。因此,C++11引入了另一种引用方式,称为右值引用,用“&&”表示。之前的C++标准中有引用,但只能操作左值,无法对右值添加引用。原创 2025-02-05 21:51:43 · 1313 阅读 · 0 评论 -
C++11新特性之long long超长整形
注意事项:C++11标准规定,每种整形类型必须同时具备有符号(signed)和无符号(unsigned)两种类型,且所占用的空间必须相同。long long 类型需要更大的存储空间,在计算时比普通整数类型(如 int)稍微慢些,因此在对性能要求较高的场景中,需要权衡是否真的需要使用long long 类型。对于无符号long long 整形,后缀用“ULL”、“ull”、“UII”、“uLL”标识。long long 超长整形是C++11标准新添加的,用于表示更大范围整数的类型。原创 2025-02-04 23:56:42 · 776 阅读 · 0 评论 -
C++11新特性之shared_ptr智能指针
智能指针顾名思义就是“智能”的指针,具体来看,智能指针与普通指针用法类似,区别就是,智能指针可以在适当的时机自动释放分配的内存,从而避免“忘记释放内存而导致内存泄漏”问题的出现。除此之外,C++11 标准还支持同一类型的 shared_ptr 对象,或者 shared_ptr 和 nullptr 之间,进行 ==,!=,<,<=,>,>= 运算。在初始化shared_ptr智能指针时,还可以自定义所指堆内存的释放规则,当堆内存引用计数为0时,优先调用自定义的释放规则。这往往是由于内存资源管理不当造成的。原创 2025-02-08 20:13:02 · 1284 阅读 · 0 评论 -
C++11新特性之返回类型后置
返回类型后置(Trailing return type)是 C++11 引入的一种新的函数声明和定义语法,它允许将函数的返回类型放在函数参数列表之后,使用。(2)对于一些复杂的返回类型,如嵌套的模板类型或需要通过类型特征(type traits)来推导的类型,返回类型后置可以使代码更易读。在这个例子中,返回类型是一个嵌套的模板类型,使用返回类型后置可以将复杂的类型推导部分放在函数参数列表之后,使函数声明的主体部分更清晰。会根据a和b的实际类型推导出a*b 表达式的类型,作为函数的返回类型。原创 2025-01-26 21:39:53 · 735 阅读 · 0 评论 -
C++11新特性之unique_ptr智能指针
与shared_ptr不同的是,unique_ptr指针指向的堆内存无法同其他unique_ptr共享,也就是每一片堆内存空间只能有一个unique_ptr指向。除此之外,C++11标准还支持同类型的 unique_ptr 指针之间,以及 unique_ptr 和 nullptr 之间,做 ==,!unique_ptr智能指针也是以模版类的形式提供的,定义在<memory>头文件,并位于std命名空间。和 shared_ptr 指针不同,为 unique_ptr 自定义释放规则,只能采用函数对象的方式。原创 2025-02-10 00:05:24 · 1097 阅读 · 0 评论 -
C++11新特性之auto
(3)auto不能用于类的非静态成员(因为在类定义阶段,只是声明了成员变量,真正的初始化发生在类的对象创建阶段,auto类型推导在编译阶段,这个时候成员变量只声明,没有初始化,违背了第一条)。(1)在编译过程中推导出变量类型后,就会替代auto,指明变量的类型。因此,auto就相当于一个占位符,只是提前占个空间,等类型推导出后,就取代它。简单的类型可以手写,但一些复杂的容易写错或不知道变量是什么类型的则推荐使用auto。(2)不能再函数参数使用,(因为函数参数一般只声明,不初始化,牢记第一条)。原创 2025-01-21 21:22:17 · 884 阅读 · 0 评论 -
C++11新特性之nullptr(初始化空指针)
nullptr是nullptr_t类型(C++11新增加的数据类型,称为“指针空值类型”)的右值常量,专门用于初始化空指针。而对于 isnull(NULL),我们期望它调用的是 isnull(void*c) 函数,但观察程序的执行结果不难看出,与我们的预期不符合。C++98标准使用期间,NULL得到了广泛应用,出于兼容性考虑,C++11对NULL没做任何改变,但为了解决这个问题,C++11标准引入了一个新的关键字——nullptr。(2)nullptr可以隐式转换成任意类型的指针,但不能转化为整数类型。原创 2025-02-07 19:29:59 · 689 阅读 · 0 评论 -
C++11新特性之连续右尖括号(>>)改进
这种限制给程序编写造成不便,因此在C++11后就对这种连续右尖括号进行了改进,对模版的这种连续右尖括号进行单独处理。这种嵌套模版在编译过程中会出现错误,因为不支持Fun<A<int>>这种写法,需要改为Fun<A<int> >(两个右尖括号中间用一个空格分开,非常不方便)。在C++11之前的泛型编程中,模版实例化有个很繁琐的地方,那就是连续右尖括号(>>)会被编译器解释为右移操作符,而不是模版参数表的结束。旧版本可能不支持,因此最好选择C++11标准以上的编译器。(1)简化了嵌套模版的使用。原创 2025-01-27 22:46:44 · 520 阅读 · 0 评论 -
C++11新特性之tuple元组
tuple(元组)是C++11新引入的一种类模版,其特点是:实例化的对象可以存储任意数量、任意类型的数据。当需要存储不同类型的元素或返回不同类型的多个数据时,都可以使用tuple。type是tup对象的类型,可以使用decltype直接推导。实例化tuple模版类对象常用的有两种——使用该类的构造函数或使用make_tuple()函数。将多个tup对象的元素合并为一个。将tup内的元素逐一赋值给args...提供的左值变量。获取tup对象第i+1个元素的类型。获取tup对象的第num+1个元素。原创 2025-01-31 20:34:10 · 670 阅读 · 0 评论 -
C++11新特性之constexpr
constexpr可以修饰模版函数,但由于其类型的不确定性,模版实例化后的函数是否符合常量表达式也不确定。对于C++内置类型的数据,可以直接用constexpr修饰,但自定义的数据类型,直接用constexpr修饰是不行的。constexpr是C++11标准引入的关键字,用于声明常量表达式,其目的是让一些计算在编译时就能完成,从而提高程序的性能与安全性。常量表达式指的是由多个常量组成的表达式,其成员都为常量,其值无法修改。注意事项:该构造函数的函数体需为空,且采用初始化列表的方式赋值时必须使用常量表达式。原创 2025-02-03 19:50:20 · 536 阅读 · 0 评论 -
C++11新特性之范围for循环
(2)传统for循环灵活性更高,能用于更加广泛的场景,实现更加复杂的循环逻辑。(3)在遍历容器时,传统for循环需要使用迭代器访问元素,范围for循环则隐藏了迭代器的细节,直接将容器值赋给变量,使代码更简洁,但也限制了对迭代过程的直接控制。在实际使用中,范围for循环常用于简单序列遍历,传统for循环则在处理复杂循环逻辑或直接控制迭代器等方面具有更大优势。那么在C++11标准中,除了上面的方法外,又引入了一种全新的语法结构,如下所示。(1)传统的for循环语法结构相对复杂,范围for循环语法更加简洁。原创 2025-02-03 00:05:18 · 485 阅读 · 0 评论 -
C++11新特性之使用using(代替typedef)定义别名
这里使用using定义别名,重定义的别名是str_map_t。传统的C++使用typedef重定义一个类型存在一些限制,例如无法直接重定义一个模版。(1)using和typedef只是给类型重定义,不会创造新的类型。需要添加额外的类来实现,显的有些繁琐,并且不利于代码的泛用。在普通类型上,typedef与using的效果相同,但定义语法略有区别。(2)using的语法比typedef更加的清晰。(1)using功能更加的全面。(2)using重定义的模版被称为模版别名。(2)重定义模版类型。原创 2025-01-29 15:54:23 · 677 阅读 · 0 评论 -
C++11新特性之lambda表达式
(6)[val1, &val2...]——以值传递的方式导入val1,引用传递的方式导入val2。(5)[&val1, &val2...]——以引用传递的方式导入val1,val2等指定变量。(4)[val1, val2...]——以值传递的方式导入val1,val2等指定变量。(7)[ this ]——以值传递的方式导入当前的this指针。(2)[ = ]—— 以值传递的方式导入所有外部变量。(3)[ & ]——以引用传递的方式导入所有外部变量。(1)[ ]——空括号表示不导入任何外部变量。原创 2025-02-01 22:16:12 · 680 阅读 · 0 评论 -
C++11新特性之auto与decltype(总结)
通过前面两篇博客的学习,相信大家对auto与decltype有了基本的认识。name为变量名,value为变量值,exp是个表达式。(1)变量值的类型不是指针或引用,auto直接抛弃限定符,推导为没有限定符的类型。auto使用简单,但推导复杂,有些情况会改变变量的类型,并且在一些场景下无法使用。(2)变量值的类型是指针或引用,auto则保留限定符。根据value值的类型,推导name的类型。decltype使用相对复杂,但会保留表达式的任何类型。auto会抛弃引用类型,推导出原始的类型。原创 2025-01-25 22:22:12 · 614 阅读 · 0 评论