C++ 11新特性之语法甜点4

2024-02-12 13:12
文章标签 c++ 特性 语法 甜点

本文主要是介绍C++ 11新特性之语法甜点4,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

        C++ 11中引入了许多简化编程工作的语法上的新特性,我们暂且美其名曰:“语法甜点”。书接上篇,我们继续介绍C++ 11中的这些“语法甜点”,也是最后一篇关于“语法甜点”的文章。

语法甜点16:新的字符串字面值

        C++ 03提供了两种字符串字面值。第一种:包含有双引号,产生以空字符结尾的const char数组。第二种:有着前标L,产生以空字符结尾的const wchar_t数组,其中wchar_t代表宽字符。C++ 03不支持Unicode编码。

        在C++ 11中,为了加强C++编译器对Unicode的支持,类别char的定义被修改为其大小至少能够存储UTF-8的8位编码,并且能够容纳编译器的基本字符集的任何成员。

        C++ 11 支持三种Unicode编码方式:UTF-8、UTF-16、UTF-32。除了上述char定义的变更, C++ 11还增加了两种新的字符类别:char16_t和char32_t,用于存储UTF-16和UTF-32的字符。

        下面展示了如何产生使用这些编码的字符串字面值。

u8"I'm a UTF-8 string"
u"This is a UTF-16 string"
U"This is a UTF-32 string"

        在上面的示例代码中,第一个字符串的类型是const char[],第二个字符串的类型是const char16_t[],第三个字符串的类型是const char32_t[]。

        为了避免在字符串中频繁使用转义字符的麻烦,C++ 11还提供了raw字符串字面值。

 R"(The String Data \ Stuff " )"R"delimiter(The String Data \ Stuff " )delimiter"

        raw字符串字面值能够和宽字面值或Unicode字面值结合起来使用,非常方便。

u8R"XXX(I'm a "raw UTF-8" string.)XXX"
uR"*@(This is a "raw UTF-16" string.)*@"
UR"(This is a "raw UTF-32" string.)"

语法甜点17:sizeof

        在C++ 11中,允许sizeof运算符作用在类型的数据成员上,而无须明确的对象。在C++ 03中,这是不允许的,会导致编译错误。

struct SomeType { OtherType member; };
// 在C++ 03中不合法,在C++ 11中合法
sizeof(SomeType::member);

语法甜点18:新的算法

        C++ 11中新增了一些比较实用的算法,比如:all_of、any_of、none_of、copy_n、copy_if、iota等。

#include <iostream>
#include <algorithm>
#include <numeric>
using namespace std;int main()
{int a[5] = {-2, -1, 0, 1, 2};auto funIsPositive = [](int v){return v > 0;};// 返回falsebool bRet = all_of(a, a + 5, funIsPositive);// 返回truebRet = any_of(a, a + 5, funIsPositive);// 返回falsebRet = none_of(a, a + 5, funIsPositive);int b[5] = {0};// 将a开始的5个元素拷贝到b中copy_n(a, 5, b);// 将1、2两个数拷贝到b中copy_if(a, a + 5, b, funIsPositive);// 将a中的每个元素加10iota(a, a + 5, 10);                                                    return 0;
}

语法甜点19:泛化的常数表达式

        ·C++ 03中本来就已经具有常数表达式的概念,比如:3+5,6*7等。常数表达式对编译器来说是优化的机会,编译器常在编译期运行它们并且将值存入程序中。同样地,在许多场合下,C++规范要求使用常数表达式,比如:数组大小、枚举值等。

        然而,常数表达式总是在遇到了函数调用时就终结。

int GetFive() { return 5; }// 不合法
int some_value[GetFive() + 5];

        C++ 11引进了关键字constexpr,允许用户保证函数是编译期常数。

constexpr int GetFive() { return 5; }// 合法
int some_value[GetFive() + 5];

语法甜点20:包装引用

        包装引用,类似于一般的引用。对于任意对象,我们可以通过模板类ref得到一个包装引用 (至于常引用,则可以通过cref得到)。

#include <iostream>
using namespace std;void f(int &r)  { r++; }
template<class F, class P> void g(F f, P t)  { f(t); }int main()
{int n = 0 ;g(f, n) ;// 输出:0cout << n << endl;g(f, ref(n));// 输出:1cout << n << endl;return 0;
}

        在C++ 11中,ref通常与std::reference_wrapper一起使用。std::ref是一个函数模板,它返回一个对给定对象的std::reference_wrapper实例。std::reference_wrapper允许我们将引用以值的形式存储、传递和操作。

#include <iostream>
using namespace std;int main()
{int x = 66;// 使用ref创建一个引用包装器reference_wrapper<int> ref_x = ref(x);// 可以通过调用get方法来访问原始引用,相当于++x++ref_x.get();// 输出:67cout << x << endl;return 0;
}

这篇关于C++ 11新特性之语法甜点4的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/702650

相关文章

利用c++判断水仙花数并输出示例代码

《利用c++判断水仙花数并输出示例代码》水仙花数是指一个三位数,其各位数字的立方和恰好等于该数本身,:本文主要介绍利用c++判断水仙花数并输出的相关资料,文中通过代码介绍的非常详细,需要的朋友可以... 以下是使用C++实现的相同逻辑代码:#include <IOStream>#include <vec

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

Springboot配置文件相关语法及读取方式详解

《Springboot配置文件相关语法及读取方式详解》本文主要介绍了SpringBoot中的两种配置文件形式,即.properties文件和.yml/.yaml文件,详细讲解了这两种文件的语法和读取方... 目录配置文件的形式语法1、key-value形式2、数组形式读取方式1、通过@value注解2、通过

C++ 右值引用(rvalue references)与移动语义(move semantics)深度解析

《C++右值引用(rvaluereferences)与移动语义(movesemantics)深度解析》文章主要介绍了C++右值引用和移动语义的设计动机、基本概念、实现方式以及在实际编程中的应用,... 目录一、右值引用(rvalue references)与移动语义(move semantics)设计动机1

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

C++打印 vector的几种方法小结

《C++打印vector的几种方法小结》本文介绍了C++中遍历vector的几种方法,包括使用迭代器、auto关键字、typedef、计数器以及C++11引入的范围基础循环,具有一定的参考价值,感兴... 目录1. 使用迭代器2. 使用 auto (C++11) / typedef / type alias