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

news2024/10/9 13:20:20

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.coloradmin.cn/o/2199111.html

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

相关文章

迪士尼数据泄露事件:全面审视数据安全策略与未来防护方向

迪士尼数据泄露事件概述 一、 事件背景以及影响 在全球数字化转型加速的浪潮中&#xff0c;数据安全已成为企业运营不可忽视的基石。 华特迪士尼公司&#xff0c;作为全球知名的娱乐传媒巨头&#xff0c;其数据泄露事件无疑为业界敲响了警钟。此次事件不仅揭示了数据保护的严…

从0开始下载安装并使用unity

首先我们要在浏览器上找到unity的官网 这一个就是了&#xff0c;我们点进去后是这个界面&#xff1a; 然后我们点击上面这张图的左下角的“下载Unity Hub”&#xff0c;推荐后续安装都装在D盘&#xff1a; 这里他会让我们注册一个账号&#xff0c;如果之前有的话登录就行了&am…

2024年第二届龙信杯 WP

2024年龙信杯 author&#xff1a;mumuzi date&#xff1a;2024/9/30 取证的一手更新都在自己的博客上&#xff0c;分区为Forensic&#xff0c;https://mumuzi7179.github.io/或https://mumuzi.blog/ DK盾云服务器&#xff1a;DK盾 镜像下载地址&#xff1a; https://pan.ba…

i18n多语言项目批量翻译工具(支持84种语言)

这里写自定义目录标题 打开‘i18n翻译助手’小程序快捷访问 打开‘i18n翻译助手’小程序 1.将需要翻译的json文件复制到输入框&#xff08;建议一次不要翻译过多&#xff0c;测试1000条以内没什么问题&#xff09; 2.等待翻译 3.翻译完成&#xff0c;复制结果 快捷访问

极狐GitLab 发布安全补丁版本 17.4.1、17.3.4、17.2.8

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

SpringBoot框架:服装生产管理的智能助手

4 系统设计 4.1 系统结构设计 在结构设计过程中&#xff0c;首先对系统进行需求分析&#xff0c;然后进行系统初步设计&#xff0c;将系统功能模块细化&#xff0c;具体分析每一个功能模块具体应该首先哪些功能&#xff0c;最后将各个模块进行整合&#xff0c;实现系统结构的…

室内人行与导航系统有哪些多样化的功能?

在现代化建筑的迷宫中&#xff0c;室内人行与导航系统如同一位无形的向导&#xff0c;引领我们穿梭于复杂的空间之中&#xff0c;极大地提升了人们在室内环境中的便捷性和安全性。这一技术领域的飞速发展&#xff0c;不仅体现在定位精度的提升上&#xff0c;更在于其多样化的功…

如何自己动手实现一个图片解答小助手

有一张图片如下所示&#xff1a; Kimi上有一个功能&#xff0c;就是解析图片内容&#xff0c;给出回答&#xff1a; 这样可以用于拍照向AI提问的场景&#xff0c;我自己也有这方面的需求&#xff0c;因此动手实践了一下。 自己动手实现的效果如下所示&#xff1a; 那么自己如何…

websocket连接异常报错1006

目录&#xff1a; 1、问题现象2、问题原因3、解决方案 1、问题现象 WebSocket状态码的作用&#xff1a; 在WebSocket协议中&#xff0c;状态码用于表示连接状态和错误信息。通过状态码&#xff0c;我们可以快速判断连接是否成功&#xff0c;以及出现错误时的原因。常见的WebSo…

makefile常见问题记录

1 Makefile:8 *** missing separator. Stop. 可能原因1&#xff1a;makefile的命令行开头必须使用Tab键 如图1所示&#xff0c;红框内为一个命令行&#xff0c;图2的缩进由敲空格实现&#xff0c;会标红&#xff0c;报错&#xff0c;图3的缩进为按Tab键&#xff0c;语法正确&…

golang接口详解

interface(接口) 接口&#xff08;interface&#xff09;定义了一个对象的行为规范&#xff0c;只定义规范不实现&#xff0c;由具体的对象来实现规范的细节 在Go语言中接口&#xff08;interface&#xff09;是一种类型&#xff0c;一种抽象的类型。相较于之前章节中讲到的那…

揭秘破解密码的常见方法和手段

前言 今天小编就帮粉丝朋友科普一下&#xff0c;破解密码的常见方法和手段&#xff0c;希望看到本文的粉丝朋友&#xff0c;给小编点赞支持支持一波 键盘监听木马 键盘监听病毒在网吧中非常流行&#xff0c;它在启动后会监听用户的键盘输入事件&#xff0c;如果有人使用账号密…

AD画完原理图,进行编译可就是不弹出错误窗口,明明原理图有错误(AD中Error Reporting设置)

AD“工程选项”对话框用于设置大量绘图和组件配置检查&#xff0c;共有12个选项卡&#xff0c;“Error Reporting&#xff08;错误报告&#xff09;”是第一个选项卡。 “Error Reporting&#xff08;错误报告&#xff09;”选项卡包含8页错误&#xff0c;“Violations Associ…

千寻位置大气增强服务为高效农耕作业保驾护航

2024年9月14日广东湛江&#xff0c;千耘QYX农机导航用户为了抢农时&#xff0c;夜晚使用导航作业&#xff0c;但导航界面一直显示浮点解&#xff0c;无法进行作业&#xff0c;非常着急&#xff0c;联系当地经销商寻求解决办法&#xff0c;经过查看&#xff0c;是因为当时电离层…

AI改革的双刃剑:从生成式AI到推理式AI的未来之路

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

一文彻底搞懂大模型 - Dify(Agent + RAG)

**Dify 是一个用于构建 AI 应用程序的开源平台。****Dify融合了后端即服务&#xff08;Backend as Service&#xff09;和LLMOps理念。它支持多种大型语言模型&#xff0c;如Claude3、OpenAI等&#xff0c;并与多个模型供应商合作&#xff0c;确保开发者能根据需求选择最适合的…

python中计算分布的分位数及累积概率

本文讨论python中怎样计算分布的分位数及累积概率 ⭐️ 根据累计概率获取分位数 在 Python 中&#xff0c;你可以使用 scipy.stats 中的 ppf&#xff08;percent point function&#xff09;来根据累积概率获取分位数。ppf 是逆累积分布函数&#xff0c;也就是根据给定的累积…

【前端安全】逆向webpack加密算法

❤️博客主页&#xff1a; iknow181 &#x1f525;系列专栏&#xff1a; 网络安全、 Python、JavaSE、JavaWeb、CCNP &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐评论✍ 0x01 webpack 简介 webpack一个静态模块打包器&#xff0c;有入口、出口、loader和插件&#xff0c;通过…

LLM RAG面试问题大全!

01 引言 RAG在通用人工智能、数据科学和人工智能的发展领域中起到了变革性的作用。RAG模型让机器能够基于事实产生更准确、连贯和一致的语言&#xff0c;它改变了人类与技术的互动方式。RAG让能够撰写独特内容、引人入胜的产品描述和新闻文章的机器人概念成为现实。尽管RAG的重…

c++primer第十四章代码重用

包含对象成员的类 包含&#xff1a;私有部分有一个类。 使用模板类&#xff0c;声明对象时必须指定具体的数据类型。 范例&#xff1a; #ifndef STUDENTC_H_ #define STUDENTC_H_ #include <iostream> #include <string> #include <valarray> class Stude…