【C++11入门】新特性总结大全-Part1

C++11标准公布后,C++社群中出现了久违的热情,有人甚至叫出“C++的复兴”。指望C++重回20世纪90年代中期那样的地位显然是昧于大势的期望,但是C++经历了这么多年的打磨与起伏,在各领域的地位已经非常稳固了。2011年新标准的出现能够大大提升C++开发的效率和质量。时至今日,能够基本了解C++11标准的程序员恐怕不多,而能够以新的C++风格开发实践的人更是凤毛麟角。因此,接下来几节,我们将盘点C++11的新特性。

作为开幕第一篇,我们先说一些我们之前用到的但是你不知道是C++11标准的新特性。

1.long long类型

C++定义了一套包括算术类型(arithmetic type)和空类型(void)在内的基本数据类型。其中算数类型包含了字符、整型数、布尔值和浮点数。空类型不对应具体的值,仅用于一些特殊的场合,例如最常见的就是当函数不返回任何值时使用void 作为返回类型。

算术类型分为两类:整型(包括字符和布尔类型在内)和浮点型。算术类型的大小在不同的机器上有所差别。下面给出C++标准规定的尺寸的最小值。

C++:算术类型
类型含义最小尺寸
bool布尔类型未定义
char字符8位
wchar_t宽字符16位
char16_tUnicode字符16位
char32_tUnicode 字符32位
short短整型16位
int整型16位
long长整型32位
long long长整型64位
float单精度浮点数6位有效数字
double双精度浮点数10位有效数字
long double扩展精度浮点数10位有效数字

C++规定一个int至少要和一个short一样大,一个long至少要和一个int一样大,一个long long至少要和long一样大。其中,数据类型long long 是在C++11中新定义的。

使用long long可以帮助处理需要大数值计算的场景,例如在金融应用,科学计算和某些算法中

2.列表初始化

C++语言定义了初始化的好几种不同形式,这也是初始化问题复杂性的一个体现。例如,想要定义一个int型的变量test_a并初始化为0,以下四条语句都可以做到这一点:

int test_a = 0;
int test_a = {0};
int test_a{0};
int test_a(0);

作为C++11新标准的一部分,用花括号{ }来初始化变量得到了全面应用 ,而在此之前,这种初始化的形式仅在某些受限的场合下才能使用。这种初始化的形式被称为列表初始化。现在,无论是初始化对象还是某些时候为对象赋值,都可以使用这样一组花括号括起来的初始值了。

3.nullptr常量

空指针不指向任何对象,在试图使用一个指针之前 代码可以首先检查它是否为空。以下列出几个可以生成空指针的方法。

int *p1 = nullptr;
int *p2 = 0;
int *p3 = NULL;//需要包含头文件<cstdlib>/<stdlib.h>

得到空指针最直接的办法就是使用C++新标准引入的nullptr字面值。 nullptr是一种特殊类型的字面值,它可以被转化成任意其他的指针类型。在这之前的程序会用到第三种方法:使用一个名为NULL的预处理变量来给指针赋值。但是当用到一个预处理变量时,预处理器会自动地将它替换为实际值,因此用NULL初始化指针和用0初始化指针是一样的。在新标准下,现在的C++程序最好使用nullptr,并且避免使用NULL。

4.类型别名声明

类型别名是一个名字,他是某种数据类型地同义词。使用类型别名有很多好处,他让复杂的类型名字变得简单明了、易于理解和使用,还有助于程序员清楚的知道使用该类型地真实目的。一般来讲有三种方法定义类型别名。

第一种#define:

#define Long long long

此处将long long类型起了个别名Long。

第二种typedef:

typedef double wages;
typedef wages* pd;

此处wages是double类型,pd是double*类型。

关键字typedef作为声明语句中的基本数据类型的一部分出现。含有typedef的声明语句定义的不再是变量而是类型别名。和以前的声明语句一样,这里的生命夫包含类型修饰,从而由基本数据类型构造出复合类型来。

typedef const T* const_iterator;

第三种using:

using myType = int;

此处将int起别名为myType。

 这种方法用关键字using作为别名声明的开始,其后,紧跟别名和等号,其作用是把等号左侧的名字规定成右侧类型的别名。

5.auto类型指示符

编程时常常需要把表达式的值赋给变量,这就要求在声明变量的时候清楚的知道表达式的类型。然而要做到这一点并非易事,有时根本做不到。为了解决这个问题,C++11新标准引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。和原来那些只应对一种特定类型 的说明符不同,auto让编译器通过初始值来推算变量的类型。显然,auto定义的变量必须是有初始值的:

auto x = 42;      // x为int类型  
auto y = 3.14;    // y为double类型  
auto z = "Hello"; // z为const char*

复合类型、常量和auto: 编译器推断出来的auto类型有时候和初始值的类型并不完全一样,编译器会适当的改变结果类型使其更符合初始化规则。最典型的例子就是引用类型:

int i=0 , &r=i;
auto a = r;

在这个例子中,r是i的引用,将r赋给a时,a的类型是i的int类型,而不是r的int&引用类型。但是我们可以使用auto&来进行处理这类问题: 此时a就是f的引用类型了。

double f=0.0;
auto& a = f;

6.范围for语句

C++11 引入的范围基于的 for 循环(range-based for loop)使得遍历容器变得更加简洁和方便。它允许开发者以非常直观的方式遍历数组、容器(如 std::vectorstd::list, 等),以及任何实现了 begin() 和 end() 方法的类型。

范围 for 循环的基本语法如下:

for (declaration : collection) {  // 对每一个 element 执行的操作  
}

declaration:用于声明循环中每个元素的变量,通常使用 auto 关键字。

collection:可以是数组、标准库容器或其他可迭代的数据结构。

以下是一些使用范围基于的 for 循环的示例:

#include <iostream>  
#include <vector>  //遍历数组
int main01() {  int arr[] = {1, 2, 3, 4, 5};  for (int x : arr) {  std::cout << x << " ";  }  return 0;  
}
//遍历容器
int main02() {  std::vector<std::string> fruits = {"Apple", "Banana", "Cherry"};  for (const std::string& fruit : fruits) {  std::cout << fruit << std::endl;  }  return 0;  
}//修改元素
int main03() {  std::vector<int> nums = {1, 2, 3, 4, 5};  for (int& n : nums) { // 使用引用以修改元素  n *= 2; // 将每个元素乘以 2  }  for (const int& n : nums) { // 输出修改后的元素  std::cout << n << " ";  }  return 0;  
}

类型推导:使用 auto 可以简化类型声明,尤其是在复杂类型或模板类型中。

常量引用:如果不需要修改元素,应该使用常量引用(const T&)来避免不必要的拷贝,并提高性能。

支持的类型:范围 for 循环可以用于支持迭代的任何类型,包括数组、标准库容器及其他实现了 begin() 和 end() 的自定义类。

7.string数值转换函数

C++11引入了一些用于字符串与数值之间相互转换的函数,主要通过<string>头文件中的std::to_stringstd::stoistd::stolstd::stollstd::stofstd::stodstd::stold等函数来实现。

std::to_string

std::to_string函数用于将数值(如整型、浮点型等)转换为字符串

int num = 42;  
double pi = 3.14159;  string numStr = to_string(num);  
string piStr = to_string(pi);  

 字符串到数值的转换

  • 整数转换

    • std::stoi: 转换为int
    • std::stol: 转换为long
    • std::stoll: 转换为long long
  • 浮点数转换

    • std::stof: 转换为float
    • std::stod: 转换为double
    • std::stold: 转换为long double
#include <iostream>  
#include <string>  
using namespace std;int main() {  string intStr = "12345";  string invalidStr = "123abc";  int num = stoi(intStr); // 转换为 int  cout << "Converted integer: " << num << endl; // 输出: 12345  try {  int invalidNum = stoi(invalidStr); // 尝试转换无效字符串  } catch (const invalid_argument& e) {  cout << "Invalid argument: " << e.what() << endl; // 输出异常信息  }  string doubleStr = "3.14159";  double pi = stod(doubleStr); // 转换为 double  cout << "Converted double: " << pi << endl; // 输出: 3.14159  return 0;  
}

这些转换函数在遇到无效输入时会抛出异常。可以使用 std::invalid_argument 和 std::out_of_range 来捕获这些异常:

  • std::invalid_argument:表示输入字符串并不代表任何有效的数值。
  • std::out_of_range:表示转换结果超出了目标类型的范围。

感谢大家!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1558612.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

智慧出行:数字孪生三维可视化大屏交通管控系统

智慧出行已成为现代城市发展的重要支柱&#xff0c;数字孪生技术在交通领域的应用不断深化。结合三维可视化技术&#xff0c;打造功能强大的大屏交通管控系统&#xff0c;将对城市交通管理带来巨大变革。该系统通过实时监测和数据分析&#xff0c;提供精准的交通状况显示和预测…

FPUA(1)DIY个人计算机

文章目录 1.需求确定2.硬件选型2.1CPU2.2关于主板2.3硬盘2.4电源2.5散热2.6机箱2.7其他 3.选型成果展示4.组装过程5.欢迎关注技术文章 电脑作为程序员生产力最重要的生产工具&#xff0c;电脑的性能对工作效率有很大影响。电脑组装的每一个环节多少都懂一些&#xff0c;但真正的…

java判断一个字符串是否是回文字符串

代码功能 接收用户输入的字符串&#xff0c;检查该字符串是否为回文&#xff08;即正序和倒序读取都相同&#xff09;&#xff0c;然后输出检查结果。 代码 import java.util.Scanner;public class PalindromeChecker {public static void main(String[] args) {Scanner sc…

微积分-反函数6.6(反三角函数)

在本节中&#xff0c;我们应用 6.1 节的思想来找到所谓反三角函数的导数。在这个任务中&#xff0c;我们遇到了一些困难&#xff1a;由于三角函数不是一对一的&#xff0c;它们没有反函数。这个困难通过限制这些函数的定义域&#xff0c;使其成为一对一的函数&#xff0c;从而得…

软件著作权

软件著作权申请材料 材料一&#xff1a;操作手册 or 设计说明书 操作手册必须有截图&#xff0c;且执行步骤须连贯&#xff0c;从登录开始&#xff0c;到主界面展示&#xff0c;各个界面跳转&#xff0c;以及主要功能介绍&#xff0c;都要符合软件使用者的使用逻辑。文字不能…

气象大模型预测的原理与实践 免费提供气象预测数据

随着气象科学的发展&#xff0c;天气预测技术在过去几十年里取得了显著进步。如今&#xff0c;气象大模型成为了天气预报的核心工具之一。这些模型依赖于复杂的数学、物理和计算方法来模拟大气运动与天气现象&#xff0c;并且在实时数据的支持下&#xff0c;可以预测未来几小时…

YOLO11涨点优化:注意力魔改 | SimAM(无参Attention),一种轻量级的自注意力机制,效果秒杀CBAM、SE

💡💡💡SimAM是一种轻量级的自注意力机制,其网络结构与Transformer类似,但是在计算注意力权重时使用的是线性层而不是点积 💡💡💡本文改进:分别加入到YOLO11的backbone、neck、detect,助力涨点 改进1结构图: 改进2结构图: 改进3结构图: ​ 《YOLOv

OpenHarmony(鸿蒙南向开发)——轻量系统内核(LiteOS-M)【内核通信机制】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 事件 基本概念 事件&#xff08;Event&#xff09;是一种任务间的…

NVIDIA 多实例 GPU

单个 GPU 中包含七个独立实例。 文章目录 前言一、优势1. 扩展 GPU 的使用范围2. 优化 GPU 利用率3. 运行同步工作负载二、 技术原理1. 根据需要调配和配置实例2. 安全、并行运行工作负载三、Blackwell GPU 中的 MIG四、为 IT 和开发运营而打造1. 从数据中心部署到边缘2. 利用容…

【一分钟学C++】指针和引用

竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~ 公众号&#xff1a; C学习与探索 | 个人主页&#xff1a; rainInSunny | 个人专栏&#xff1a; Learn OpenGL In Qt 文章目录 指针普通指针函数指针注意事项 引用左值引用右值引用注意事项 指针和引用区别 指针 普通指针 指针是一个…

宝兰德加入中国交通运输协会信息专业委员会,携手共绘交通行业信息化新篇章

近日&#xff0c;中国交通运输协会信息专业委员会&#xff08;以下简称信专委&#xff09;第四届会员代表大会暨第四届一次理事会扩大会议在北京成功举行。宝兰德受邀出席会议&#xff0c;会议总结了第三届理事会的工作&#xff0c;修改了信专委工作规则&#xff0c;选举产生了…

Android Camera系列(四):TextureView+OpenGL ES+Camera

别人贪婪时我恐惧&#xff0c;别人恐惧时我贪婪 Android Camera系列&#xff08;一&#xff09;&#xff1a;SurfaceViewCamera Android Camera系列&#xff08;二&#xff09;&#xff1a;TextureViewCamera Android Camera系列&#xff08;三&#xff09;&#xff1a;GLSur…

一键生成PPT在线使用的保姆级教程:告别加班就靠它

已经过完24年所有的法定节假日的你&#xff0c;上班状态还好吗&#xff1f; 小编人倒是挺飘忽的&#xff0c;就那种人在工位&#xff0c;魂仍在青青大草原的感觉&#xff0c;都是牛马却失去了自由奔跑的权利...... 尤其是还要面对节前一堆没完成的工作&#xff0c;手动完成不…

Day-1 java入门

什么是JAVA? Java是美国的sun 公司(Stanford University Network)在1995年推出的一门计算机高级编程语言。 sun公司于2009年被Oracle(甲骨文)公司收购。 普遍认同Java的联合创始人之一:詹姆斯 高斯林 (James Gosling)为ava之父。 JAVA三大技术平台 Java SE(Java Standa…

大模型 + 在线运行 + ISRealsoft ⇒ 编程运行验证一体化

最近在撰写《计算机的错误计算》系列内容。其中用到三种在线工具&#xff0c;分别是大语言模型、在线运行软件以及 ISRealsoft 在线软件。 系列主要介绍各种软硬件关于数值计算的误差或错误计算。比如&#xff0c;各种数学库 math 中涉及的函数的误差&#xff0c;或算术表达式&…

用伪代码Prompt让LLM进行图推理,生成更精准内容

最近有研究发现&#xff0c;当LLM面对结构化数据&#xff0c;特别是图数据时&#xff0c;LLM的表现却不尽如人意。这几天&#xff0c;来自希腊和法国的研究团队提出了一种创新方法——利用伪代码提示来增强LLM的图推理能力。我基于这项研究先写了一个伪代码的SYSYTEM PROMPT运行…

【智能算法应用】正切搜索算法求解二维路径规划问题

摘要 本文提出了基于正切搜索算法的二维路径规划方法&#xff0c;用于解决包含障碍物的复杂路径规划问题。通过在二维平面中建立障碍物模型和路径目标点&#xff0c;利用正切搜索算法进行路径搜索&#xff0c;找出从起点到终点的最优路径。实验结果显示&#xff0c;该算法在不…

5. PH47 代码框架软件开发环境搭建

5.1. 概述 PH47 软件开发环境搭建比较简单&#xff0c;但毫无疑问非常重要。主要涉及到 stm32 编译链接工具 Keil&#xff1b;代码编辑器 Visual Studio 或者 VS code。 若需要更进一步进行 PH47 框架在不同 stm32 芯片间移植&#xff0c;那么还需要Stm32CubeMx 初始化代码生成…

Python 如何使用 SQLAlchemy 进行复杂查询

Python 如何使用 SQLAlchemy 进行复杂查询 一、引言 SQLAlchemy 是 Python 生态系统中非常流行的数据库处理库&#xff0c;它提供了一种高效、简洁的方式与数据库进行交互。SQLAlchemy 是一个功能强大的数据库工具&#xff0c;支持结构化查询语言&#xff08;SQL&#xff09;…

小白入门《大模型应用开发极简入门》学习成为善用 AI 的人!

《大模型应用开发极简入门&#xff1a;基于 GPT-4 和 ChatGPT》这本书旨在为读者提供一个从零开始&#xff0c;快速掌握大语言模型&#xff08;LLM&#xff09;开发的入门指南&#xff0c;特别是基于 GPT-4 和 ChatGPT 的应用开发。书中内容涵盖了大模型的基础概念、架构原理、…