当前位置: 首页 > news >正文

商丘企业网站建设费用多少钱网站字号多大

商丘企业网站建设费用多少钱,网站字号多大,上海外贸营销网站建设网站,软件技术论坛探索C14新特性#xff1a;更强大、更高效的编程 C14并没有太大的改动#xff0c;就连官方说明中也指出#xff0c;C14相对于C11来说是一个比较小的改动#xff0c;但是在很大程度上完善了C11#xff0c;所以可以说C14就是在C11标准上的查漏补缺。 C14在2014年8月18日正式…探索C14新特性更强大、更高效的编程 C14并没有太大的改动就连官方说明中也指出C14相对于C11来说是一个比较小的改动但是在很大程度上完善了C11所以可以说C14就是在C11标准上的查漏补缺。 C14在2014年8月18日正式批准宣布同年12月15日正式发布release版本。本文中将就变动部分做一个总结有需要改进和提升的地方希望大家批评指正。 1、引言 1.1新的语言特性 变量模板泛型 lambdalambda 初始化捕获新建/删除省略放宽对 constexpr 函数的限制二进制文字数字分隔符函数的返回类型推导具有默认非静态成员初始值设定项的 聚合类。 1.2新库功能 std::make_unique std::shared_timed_mutex 和 std::shared_lock std::整数序列 标准::交换 std::引用 以及对现有图书馆设施的许多小改进例如 某些算法的两范围重载 类型特征的类型别名版本 用户定义的basic_string、持续时间和复杂的文字 ETC。 2、变量模板 在C11 及之前我们只有针对类和函数的模板。C14 中新增了变量模板 templateclass T constexpr T pi T(3.1415926535897932385L); templateclass T T circular_area(T r) {return piT *r * r; }变量模板同样可以在类变量中使用 templateclass T class X {static T s; }; templateclass T T XT::s 0;Xint x_int; Xfloat x_float;int main() {int value_int Xint::s; // 获取 int 类型的静态成员变量值float value_float Xfloat::s; // 获取 float 类型的静态成员变量值// ...return 0; }类似函数和类模板当变量模板被引用时则会发生实例化。 3、lambda 表达式的新增功能 3.1 泛化 支持在 lambda 表达式中使用 auto 定义变量类型这一特性允许 Lambda 的形参或者内部变量的类型由编译器自动推导而不必显式指定。 #include iostream #include algorithmint main() {// Lambda 表达式 glambda用于输出元素auto glambda [](auto a) { std::cout a ; };int a[] { 4, 2, 6, 3, 7, 5 };// 使用 for_each 算法遍历数组并对每个元素调用 Lambda 表达式 glambdastd::for_each(a, a sizeof(a) / sizeof(int), glambda);std::cout std::endl;return 0; }3.2 对捕获的变量和引用进行初始化 include iostream using namespace std; int main() {int x 4;auto y [r x, x x 1]()-int{r 2;return x * x;}(); cout x x y y endl; } // 输出结果x 6 y 25auto y [r x, x x 1]() - int { ... }(); 定义了Lambda表达式并立即调用。 [r x, x x 1]捕获了变量 x通过引用捕获了 r同时对 x 进行了初始化将 x 的值增加了1。()-int { r 2; return x * x; }Lambda表达式的主体对捕获的变量进行操作。r 是通过引用捕获的所以对 r 的修改会影响到外部的 x。Lambda表达式返回 x * x 的结果。 4、constexpr 函数可以包含多个语句 在 C11 中如果想使用 constexpr 方法只能包含一个返回语句。 #include iostream constexpr int square(int x) {return x * x; } int main() {constexpr int result square(5); // 合法的 constexpr 函数调用// 在 C11 中下面的调用将导致编译错误// constexpr int invalidResult []() {// int sum 0;// for (int i 1; i 5; i) {// sum i;// }// return sum;// }();std::cout Result: result std::endl;return 0; }C14 中放宽了此要求允许 constexpr 函数中声明变量使用循环和条件语句等 #include iostream #include cmath using namespace std; constexpr bool isPrimitive(int number) {if (number 0) {return false;}for (int i 2; i sqrt(number) 1; i) {if (number % i 0) {return false;}}return true; } int main() {cout boolalpha isPrimitive(102) isPrimitive(103);return 0; }需要注意的是虽然C14对constexpr函数的要求放宽了一些但仍然有一些限制。例如递归和复杂的控制流结构可能仍然无法在constexpr函数中使用。 在C11中我们一般需要通过递归来实现相同的功能 constexpr bool isPrimitive(int number, int currentFactor, int maxFactor) {return currentFactor maxFactor ? true : (number % currentFactor 0 ? false : isPrimitive(number, currentFactor 1, maxFactor)); } constexpr bool isPrimitive(int number) {return number 0 ? false : isPrimitive(number, 2, sqrt(number) 1); }5、整型字面量 5.1 二进制字面量 支持使用 0b 开头的一串数字作为二进制表示的整型 int a 0b10101001110; // 13585.2 数字分隔符 支持在数字中使用单引号进行分割便于阅读。在编译时这些单引号会被忽略。 int a 123456789; // 1234567896、返回类型自动推导 在 C14 中我们可以使用 auto 作为函数返回值并且不需要指明其返回类型的推导表达式 int x 1; auto f() { return x; } /* c11 auto f() - decltype(x) { return x; } */这种类型推导有一些限制 相同类型的推导 在一个函数中所有的返回语句必须推导出相同的类型。 int x 1; auto f() { return x; } // 合法使用 {} 包裹的数据 对于使用 {} 包裹的数据作为返回值时无法推导其类型。 auto g() { return {1, 2, 3}; } // 不合法虚函数和 coroutine 不能被推导 虚函数和协程不能使用此类型推导。 函数模板中的类型推导 函数模板中可以使用类型推导但显式实例化和特化版本必须使用相同的返回类型描述符。 template typename T auto h(T value) { return value; }template auto hint(int); // 合法这些限制是为了保证类型推导的一致性和可靠性。虽然C14引入了更多的自动类型推导但在一些情况下显式指定返回类型仍然是必要的。 7、exchange exchange 用于移动语义可以使用指定的新值替换掉原值并返回原值。其定义在C20中被简单修改如下 templateclass T, class U T constexpr // since C20 T exchange(T obj, U new_value) {T old_value std::move(obj);obj std::forwardU(new_value);return old_value; }其使用如下 #include iostream #include vector #include utility using namespace std; int main() {vectorint v {5, 6, 7};std::exchange(v, { 1,2,3,4 });std::copy(begin(v), end(v), ostream_iteratorint(cout, ));cout endl; }8、quoted 该类用于字符串转义的处理。使用 out quoted(s, delim, escape) 的形式可以将字符串 s 的转义格式写入输出流中 使用 in quoted(s, delim, escape) 可以将输入流去除转义格式后写入字符串 s 中。其中delim 指明了需要转义的字符escape 指明了修饰该转移字符的字符 #include iostream #include iomanip #include sstream using namespace std; int main() {stringstream ss;string in String with spaces, and embedded \quotes\ too;string out;auto show [](const auto what) {what in? cout read in [ in ]\n stored as [ ss.str() ]\n: cout written out [ out ]\n\n;};ss quoted(in); show(in);ss quoted(out);show(out);ss.str(); in String with spaces, and embedded $quotes$ too;const char delim{ $ };const char escape{ % };ss quoted(in, delim, escape);show(in);ss quoted(out, delim, escape);show(out); }9、C14 经常考到的知识点 9.1 C14 引入了哪些新特性 C14 引入了一些新特性包括但不限于以下内容 通用Lambda表达式允许在lambda函数中使用auto关键字来推导参数类型。自动返回类型推导允许使用auto关键字自动推导函数返回值类型。初始化列表的泛型支持可以使用auto关键字在初始化列表中推导元素类型。带有二进制分隔符的整数字面量可以在整数常量中使用单撇号作为分隔符提高可读性。constexpr函数的扩展constexpr函数可以包含更多操作例如循环和条件判断。变长参数模板Variadic Templates的改进支持递归处理变长参数模板的展开。返回void类型的lambda表达式允许定义返回void类型的lambda函数。 9.2 C14 中 auto 关键字的用法和限制是什么 在 C14 中auto 关键字用于自动类型推导可以根据初始化表达式的类型来确定变量的类型。它的使用和限制如下 自动类型推导使用 auto 关键字声明变量时编译器会根据初始化表达式的类型自动推导出变量的类型。 auto x 42; // 推导为int型 auto name “John”; // 推导为const char*型声明时必须初始化使用auto声明变量时必须进行初始化。因为编译器需要根据初始化表达式来推导出变量的类型。 auto y; // 错误未初始化可与引用结合使用auto关键字可以与引用一起使用从而推导出引用的类型。 int a 10; auto ref a; // 推导为int型ref是a的引用不支持数组或函数指针auto不能直接用于数组或函数指针的声明。但可以通过decltype结合auto来实现对数组或函数指针类型进行推导。 int arr[] {1, 2, 3}; auto arrRef arr; // 错误无法推导arr的数组类型 decltype(arr) arrType; // 使用decltype获取arr的数组类型并声明arrType void foo(); auto funcPtr foo; // 错误无法推导foo的函数指针类型 decltype(foo)* funcPtrType; // 使用decltype获取foo的函数指针类型并声明funcPtrType 需要注意的是auto 在 C14 中的用法和限制可能与之后的标准如 C17、C20 等有所不同具体取决于编译器和所使用的标准版本。 9.3 C14 中如何使用 Lambda 表达式有什么改进 在C14中使用Lambda表达式的语法与之前的C版本相似。Lambda表达式是一种可以在代码中内联定义匿名函数的方式。 下面是一个使用Lambda表达式的示例 #include iostream #include vector #include algorithm int main() {std::vectorint numbers {1, 2, 3, 4, 5};// 使用Lambda表达式进行遍历打印std::for_each(numbers.begin(), numbers.end(), [](int num) {std::cout num ;});return 0; }在 Lambda 表达式中方括号 [] 用于捕获外部变量可选。小括号 ( ) 内指定参数列表可选箭头 - 后面指定返回类型可选。 C14 对于 Lambda 表达式有一些改进其中最显著的改进是可以自动推导返回类型。这意味着你不需要显式地指定返回类型编译器会根据表达式体来推断返回类型。 以下是一个示例 auto lambda [](int a, int b) {return a b; };在上述示例中我们没有显式指定返回类型但编译器会自动推断出返回类型为整数因为a和b都是整数。 此外在 C14 中还引入了泛型 lambda使得可以在 lambda 函数中使用 auto 关键字作为参数类型更加灵活和方便。 9.4 C14 对于 constexpr 关键字有何改进 C14 对于 constexpr 关键字进行了一些改进使得其更加灵活和强大。在 C11 中constexpr只能用于表示常量表达式的函数和构造函数而在 C14 中它还可以用于一些额外的情况。 首先在 C14 中constexpr函数可以包含一些非常量表达式的逻辑只要这部分逻辑在运行时不会执行即可。这意味着我们可以在constexpr函数内使用循环、条件语句等非常量表达式的控制流程。 其次C14引入了对变量模板Variable Templates的支持并且允许将变量声明为constexpr。这样我们就可以定义并初始化一个编译期间可计算的常量变量。 此外在 C14 中对于某些标准库类型如数组、字符串等它们也提供了更多的支持以便于使用在编译期间计算出来的常量值。 9.5 C14 中提供了哪些新的标准库组件和功能 C14引入了一些新的标准库组件和功能以下是其中的一些主要特性 std::make_unique提供了在堆上创建 unique_ptr 对象的便捷方式。std::integer_sequence支持编译时整数序列的操作用于元编程。std::user_defined_literals允许用户定义自己的字面量后缀扩展了语言的表达能力。通用 lambda 表达式允许使用 auto 参数声明参数类型使得 lambda 表达式更加灵活。变长模板参数折叠Variadic template parameter packs expansion可以将多个参数打包传递给模板函数或类并且可以对它们进行展开操作。std::experimental 命名空间引入了一些实验性质的标准库组件如 optional、any、string_view 等。 9.6 在 C14 中变长参数模板是如何使用的 在 C14 中可以使用变长参数模板Variadic Templates来处理可变数量的函数参数。通过使用递归展开参数包的方式可以灵活地处理任意数量的参数。 下面是一个示例 #include iostream // 递归终止条件当没有剩余参数时停止递归 void printArgs() {std::cout All arguments have been printed. std::endl; } // 可变参数模板展开第一个参数并调用自身处理剩余参数 templatetypename T, typename... Args void printArgs(T first, Args... args) {std::cout Argument: first std::endl;printArgs(args...); // 递归调用自身处理剩余参数 } int main() {printArgs(1, Hello, 3.14, A);return 0; }输出结果 Argument: 1 Argument: Hello Argument: 3.14 Argument: A All arguments have been printed.在上述代码中printArgs 是一个可变参数模板函数。它首先处理第一个传入的参数 first然后递归地调用自身处理剩余的 args 参数。当所有参数都被展开并打印完毕后最终会到达递归终止条件。 这种方式使得我们能够在编译时处理不同数量和类型的函数参数并且可以灵活地进行操作。 9.7 在 C14 中是否允许在 lambda 函数内定义其他函数或类 在 C14 中lambda 函数内是不允许定义其他函数或类的。Lambda 函数是一个匿名的函数对象它通常用于简化代码提供一种在局部范围内编写小型函数的方式。Lambda 函数本质上是一个闭包它可以捕获外部作用域中的变量并且具有与普通函数相似的行为。 然而在 C17 中引入了嵌套lambda的概念使得在 lambda 函数内定义其他 lambda 函数成为可能。在这种情况下内层的 lambda 函数可以访问外层 lambda 函数的变量。所以如果你想要在 C14 中定义其他函数或类建议将其定义在 lambda 之外的范围内。 9.8 C14 是否支持原始字符串字面量raw string literals如何使用它们 是的C14 支持原始字符串字面量raw string literals。 原始字符串字面量可以用来表示包含特殊字符例如转义序列和引号的字符串而无需使用转义符号。它们由Rdelim(raw_characters)delim的语法表示其中delim可以是任何非空字符序列并且在开始和结束位置上必须匹配。 以下是一个示例 #include iostream int main() {const char* str1 R(Hello \n World!);std::cout str1 std::endl; // 输出Hello \n World!const char* str2 R###(This is a quoted string.)###;std::cout str2 std::endl; // 输出This is a quoted string.return 0; }在上面的示例中我们使用了原始字符串字面量来创建包含特殊字符的字符串而不需要使用额外的转义符号。 9.9 在 C14 中std::make_unique和std::make_shared这两个函数的作用是什么 在 C14 中std::make_unique和std::make_shared是用于创建智能指针的函数模板。 std::make_unique用于创建一个std::unique_ptr对象它拥有独占所有权的动态分配对象。这个函数接受参数并返回一个std::unique_ptr它会自动管理内存释放。示例 auto ptr std::make_uniqueint(42);std::make_shared用于创建一个std::shared_ptr对象它可以被多个指针共享的动态分配对象。这个函数接受参数并返回一个std::shared_ptr它使用引用计数来管理内存释放。示例 auto ptr std::make_sharedint(42);这两个函数可以减少手动进行资源管理的工作量并提供了更安全、更简洁的方式来处理动态分配对象。 9.10 C14 引入了统一初始化语法uniform initialization syntax具体有哪些变化 C14 引入了统一初始化语法uniform initialization syntax它允许使用一种更统一和一致的方式进行初始化。具体的变化包括以下几个方面 初始化列表initializer list可以使用花括号 {} 来初始化对象无论是简单类型还是复杂类型。例如 int num{ 42 }; std::vector vec{ 1, 2, 3 };自动类型推导在使用统一初始化语法时编译器可以自动推导出变量的类型。 auto value{ 3.14 }; // 推导为 double 类型 auto str{ “Hello” }; // 推导为 const char[6] 类型统一构造函数调用语法通过统一初始化语法可以直接调用类的构造函数进行对象的创建。 class MyClass { public: MyClass(int value) { /* 构造函数实现 */ } // … }; MyClass obj{ 42 }; // 调用构造函数创建对象空初始化可以使用 {} 或 () 进行空初始化不再需要显式地指定默认值。 int num{}; // 初始化为0 std::string str{}; // 初始化为空字符串 zer list可以使用花括号 {} 来初始化对象无论是简单类型还是复杂类型。例如 int num{ 42 }; std::vector vec{ 1, 2, 3 }; 2. 自动类型推导在使用统一初始化语法时编译器可以自动推导出变量的类型。 auto value{ 3.14 }; // 推导为 double 类型 auto str{ “Hello” }; // 推导为 const char[6] 类型 3. 统一构造函数调用语法通过统一初始化语法可以直接调用类的构造函数进行对象的创建。 class MyClass { public: MyClass(int value) { /* 构造函数实现 */ } // … }; MyClass obj{ 42 }; // 调用构造函数创建对象 4. 空初始化可以使用 {} 或 () 进行空初始化不再需要显式地指定默认值。 int num{}; // 初始化为0 std::string str{}; // 初始化为空字符串 这些变化使得初始化更加灵活和一致并且提供了更强大的类型推导能力。注意在使用统一初始化语法时要注意类型的精确匹配和可能的隐式转换。
http://www.sadfv.cn/news/114477/

相关文章:

  • 做网站前需要做什么准备如何在网上推广自己
  • 如何创建一个自己的网站wordpress 菜单结构
  • 找人做个网站大概多少钱帮熟人做网站如何收费
  • 百度品牌广告是什么seo搜索引擎优化人才
  • 兰州网站seo诊断品牌策划岗位职责
  • 黔西网站建设软件开发语言都有哪些
  • 宣传品牌网站建设网站备案用户注销备案申请表
  • 简述建设一个网站的过程鲜花网站建设项目策 划书
  • 福清网站建设专家哪里有网站模板下载
  • 网站建设合同有法律效益吗apache添加多个网站
  • 做网站年入千万西安企业网站排名优化工具
  • 珞珈学子网站建设WordPress大前端dux
  • psd网站首页图片集团网站设计开发
  • 厦门仿站定制模板建站一键搭建论坛
  • 深圳做网站的公有哪些可以做外链的网站
  • 网站开发三层架构网站建设与应用 教案
  • 不用备案的网站哪里买做网站开发服务商
  • 制作公司工作网站h5响应式网站开发
  • 网站开发主要使用的技术工商局网站年检怎么做
  • 沈阳网站建设设计公司网站建设的注意事项
  • 做韩国护的网站成都私人做网站建设的公司
  • 有创意的网站开发网站制作验收单
  • 运城做网站方式方法福建住房城乡建设厅网站
  • 17网做网站辛集手机网站建设
  • 重庆网站建设工作室智博常州网站建设
  • 免费建站资源中国前十名别墅装修公司
  • 长沙 直播网站建设现在一般做网站都是去哪家做的
  • 商城类网站方案手机网站搭建多少钱
  • 做一个静态网站多少钱百度的广告
  • wordpress更改站点名称在线制图免费版