C++ 零碎特性

2023-05-16

摘自《C++ 17 入门经典》。几乎不会再更新。

文章目录

            • 使用花括号初始化变量
            • 零初始化
            • 使大整型字面量更加易读
            • 二进制的整型字面量
            • `size_t` 类型
            • 浮点数的特殊情况:NaN(Not a Number)和 infinity
            • 显式类型转换
            • 获得数值的上下界
            • 不要混合使用 `cout` 和 `wcout`
            • `auto` 与 `std::initializer_list`
            • 运算结果至少是 `int`,不会是 `short`
            • 强类型的枚举
            • `switch` 定义变量的限制
            • `if` 和 `switch` 语句的初始化
            • 使用 `std::array` 代替普通数组
            • 使用 `std::size` 获取数组的大小
            • 使用 `auto*`
            • 常量指针与指向常量的指针
            • `new[]`
            • 指向数组的指针
        • 智能指针
          • 包含 `memory` 头文件
          • `unique_ptr`
            • 使用 `std::make_unique`
            • 创建指向数组的指针
            • `get` 方法
            • `reset` 方法
            • `release` 方法
          • `share_ptr`
            • `std::string::data` 方法
            • `std::string` 字面量
            • `std::to_string` 函数
            • `std::stoi` 函数
            • 原始字符串

使用花括号初始化变量
代码:三种初始化变量的方式
int a = 1.1;
int b(1.2);
int c{ 1.3 }; // WRONG

使用花括号初始化变量的特点有两个:

  1. 允许以相同的方式初始化所有变量,这一点我们之后再进行进一步的讨论;
  2. 当发生收缩转换时,编译器将会报错而非警告。
零初始化

使用花括号进行初始化时,若想要让默认值为 0,可以省略 0。

代码:零初始化
int a = 0;
int b(0);
int func(); // a function here!
int c{}; // 0 by default, OK!

注意在使用圆括号进行初始化时并不能省略这个 0,否则这表示的将会是一个函数。

使大整型字面量更加易读
代码:数字分隔符
auto a{ 1'0'0'0'0000'0000 };
二进制的整型字面量
代码:二进制整型字面量
auto a{ 0b1011 }, b{ 0B1011 };
size_t 类型

sizeof 运算符得到的结果是一个 size_t 类型的整数,size_t 的宽度取决于目标平台。size_t 是无符号的。

一般而言,size_t 可以直接被使用。它还在 cstddef 头文件中被定义。

浮点数的特殊情况:NaN(Not a Number)和 infinity

有关它们的运算法则,可以在需要时进行测试或查阅。

可以使用 cmath 中的 std::isinf() 函数和 std::isnan() 函数判断一个浮点数是否是 NaN 或者 infinity。

显式类型转换
代码:显式类型转换
int a{ static_cast<int>(1.1) };
获得数值的上下界

使用 limits 头文件中的 numeric_limits 类获取我们需要的值。

代码:numeric_limits
constexpr auto a = std::numeric_limits<int>::min();
constexpr auto b = std::numeric_limits<int>::max();
constexpr auto c = std::numeric_limits<double>::min();
constexpr auto d = std::numeric_limits<double>::max();
constexpr auto e = std::numeric_limits<double>::lowest();
不要混合使用 coutwcout

是否使用宽字符输出,取决于第一个输出操作是使用的 cout 还是 wcout

autostd::initializer_list

仅在 cpp 17 中满足下列规则:

auto a{ 1 }; // int
auto b = { 1 }; // std::initializer_list<int>
auto c = { 1, 2 }; // std::initializer_list<int>
auto d{ 1, 2 }; // WRONG!
运算结果至少是 int,不会是 short
强类型的枚举
代码:新的枚举
int main()
{
	enum OldOne
	{
		ichi,
		ni,
		sann
	};
	OldOne a = OldOne::ichi;
	a = static_cast<OldOne>(2);
	a = sann;
	enum class NewOne
	{
		ICHI = 1,
		NI,
		SANN
	};
	NewOne b = NewOne::ICHI;
	b = static_cast<NewOne>(2);
	b = SANN; // WRONG
	return 0;
}
switch 定义变量的限制

switch 中,如果变量被定义的同时被初始化,就不能绕过变量的定义而进入变量的作用域。

代码:错误的 switch
switch (0)
{
case 1:
	int a{ 1 };
default:
	break;
}

以上代码中,在 default 后面是可以访问变量 a,即在作用域范围内,但是在进入 default 时,变量 a 并没有被初始化,这是不允许的。

ifswitch 语句的初始化
代码:如果我是 for
if (int i{ 1 }; i <= 10);
switch (int i{ 1 }; i);
使用 std::array 代替普通数组

需要包含 array 头文件。

使用 std::size 获取数组的大小

支持普通数组和 array

使用 auto*

如果要用指针初始化一个变量,建议使用 auto* 而非 auto,因为在使用 auto* 时,若给定值不是一个指针,编译将不会通过。

常量指针与指向常量的指针

const 在类型前,指向常量的指针,即指针可以指向别处,但修改不了被指向的地方。

const 在星号后,常量指针,即指针本身不可指向别处,但可以修改被指向的地方。

new[]

在使用类似于 new int[3] { 0, 1, 2 } 的代码时,不能省略表示大小的 3

指向数组的指针
代码:奇怪的 new
int main()
{
	auto a{ new int[3][4] {} };
	int(*b)[4]{ new int[3][4] {} }; // note (*b)
	delete[] a;
	delete[] b;
}

只有第一维能够是动态的,后面的维度必须是 constexpr 的。

智能指针

包含 memory 头文件
unique_ptr<T>

该对象储存唯一的地址,并且这个地址被该对象独占。释放该对象时,其对应的指针也会释放。

代码:unique_ptr
std::unique_ptr<int> p{ new int {233} };
使用 std::make_unique<T>
代码:make_unique
auto p{ std::make_unique<int>(666) };
创建指向数组的指针
代码:指向数组的智能指针
std::unique_ptr<int[]> p{ std::make_unique<int[]>(10) };
p[0] = 1;
get 方法

使用 get 方法能够获得智能指针包含的地址。使用 get 函数,务必保证不会长时间保存得到的指针。

reset 方法

reset 方法可以修改智能指针指向的值,并且在此之前对已有的指针进行删除操作。

代码:reset 方法
auto p{ std::make_unique<int>(233) };
p.reset(new int{ 666 });
release 方法

使用 release 方法可以将已经存在的指针宣布由自己管理,智能指针不再插手,将被设为指向 nullptr

代码:release 方法
auto p{ std::make_unique<int>(233) };
auto* t = p.release();
delete t;
share_ptr<T>

share_ptr 在内部对同一个地址有一个引用计数。与 unique_ptr 不同的是,可以用一个 share_ptr 对另一个 share_ptr 进行赋值。

share_ptr 没有 release 方法和 get 方法,其他内容大同小异。

std::string::data 方法

在 cpp 17,data 方法将返回一个非 const 的指针,而在之前的标准中得到的指针是 const 的。

std::string 字面量

首先使用 using namespace std::string_literals;,然后在字符串字面量后面加上后缀 s,就能得到一个 std::string 对象。

using namespace std::string_literals;
"literal"s;
std::to_string 函数

该函数能将基本类型转换为 std::string

std::stoi 函数

该系列函数将 std::string 转换为数字。

原始字符串
代码:原始字符串
LR"(Row)"; // ( 和 ) 别省略
R"(row)";
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 零碎特性 的相关文章

  • C语言多文件编程基本格式

    1 背景 xff1a 用一个丢骰子的简单案例熟悉了C语言多文件编程该咋写 2 格式 xff08 1 xff09 主函数文件main c 文件头part1 所有要使用的函数 include include include 文件头part2 放
  • STM32汇编程序及点灯实验

    目录 一 Keil下编写汇编程序1 新建工程2 配置环境3 测试代码 二 HEX文件格式说明1 简介2 格式说明3 举例说明 上述工程生成的 hex文件 三 基于STM32 汇编每间隔1秒钟闪烁一次LED的程序 一 Keil下编写汇编程序
  • c++单向链表逆序

    include lt iostream gt using namespace std struct node int data node next node createlist int n 创建一个链表 xff0c n为存储的数据个数 n
  • 目标检测6--NanodetPlus算法分析

    文章目录 1 简介2 辅助训练模块Assign Guidance Module3 损失函数4 标签匹配策略5 后处理介绍6 特征融合参考资料 欢迎访问个人网络日志 x1f339 x1f339 知行空间 x1f339 x1f339 1 简介
  • Couldn't find executable named map_saver below /opt/ros/indigo/share/map_server

    在使用 Mastering ROS for Robotics Programming PACKT 2015 学习ros xff0c 学习到第四章的时候 xff0c 先是安装Navigation一直找不到dependencies 换了源进行u
  • Linux之索引节点inode(index node)

    inode就是索引节点 xff0c 它用来存放档案及目录的基本信息 xff0c 包含时间 档名 使用者及群组等 inode 是 UNIX Linux 操作系统中的一种数据结构 xff0c 其本质是结构体 它包含了与文件系统中各个文件相关的一
  • String、StringBuffer、Stringbulider的区别

    java中用于处理字符串常用的有三个类 java lang String java lang StringBuffer java lang StrungBuilder 三者共同之处 都是final类 不允许被继承 xff0c 主要是从性能和
  • 常用集合List、Set、Map的比较

    概述 List Set Map都是接口 xff0c 前两个继承至Collection接口 xff0c Map为独立接口 List有序 xff0c 可重复 1 ArrayList 底层 xff1a 数组 xff1b 查询快 xff0c 增删慢
  • Apache中的默认编码

    好吧 xff0c 在Django上测试挺好的GBK编码的静态文件 xff0c 部署到Apache后乱码了 xff0c 默认编码变成了UTF 8 xff0c 可是meta中明明指定了charset为GBK的 xff1a lt meta htt
  • SpringDoc使用

    文章目录 1 SpringDoc简介2 SpringDoc基础使用 1 SpringDoc简介 SpringDoc是一款可以结合SpringBoot使用的API文档生成工具 2 SpringDoc基础使用 POM文件 span class
  • Result统一响应数据

    目录 1 响应数据的格式 1 1 状态码划分 1 3 响应数据的封装 2 统一数据返回 1 响应数据的格式 在分离的环境中 xff0c 我们前后交互就显得尤为重要 前端按照接口文档中的URL地址和参数要求发送请求 xff0c 接着后端对业务
  • SpringBoot实现全局异常处理器

    1 本文使用 64 ControllerAdvice 64 ExceptionHandler 进行全局的 Controller 层异常处理 不用在 Controller 层进行 try catch xff01 package com exa
  • 排序算法的对比

    冒泡排序VS选择排序 两者时间复杂度O n2 冒泡排序找最大值放在最后 xff0c 选择排序找最小值放在前面 选择排序属于不稳定排序 xff1b 选择排序一般情况下优于冒泡排序 xff0c 每轮只交换一次 如果集合有序度高 xff0c 则选
  • Redis基本操作

    安装Redis docker compose安装 单节点 version 34 3 3 34 services master image redis 6 0 container name redis environment 34 disco
  • RabbitMQ初级操作

    MQ 消息队列 xff1a 一种进程通信或同一进程的不同线程的通信方式 采用链表结构实现 xff0c 拥有权限的进程向消息队列写入或读取消息 常用MQ xff1a RabbitMQ ActiveMQ kafka xff0c Redis的Li
  • SpringBoot——邮件模块

    SpringBoot集成邮件模块 邮件协议 原文链接 xff1a https blog csdn net qq 37745470 article details 89094227 什么是SMTP xff1f SMTP全称为Simple Ma
  • JVM内存结构

    JVM JVM xff1a Java Virtual Machine xff0c Java虚拟机 xff0c 识别 class后缀文件 xff0c 解析class的指令 xff0c 调用操作系统函数完成操作 JVM JRE JDK关系 xf
  • JVM类加载机制

    类加载过程3个阶段 xff1a 1 加载 将类的字节码载入方法区 xff0c 并创建 Class对象 加载符号引用到类常量池 xff0c 只是有这个名字UnresolvedClass Name 如果类的父类没有加载 xff0c 先加载父类加
  • nginx 反向代理配置

    Nginx 反向代理 xff1a 其实客户端对代理是无感知的 xff0c 因为客户端不需要任何配置就可以访问 xff0c 我们只需要将请求发送到反向代理服务器 xff0c 由反向代理服务器去选择目标服务器获取数据后 xff0c 在返回给客户

随机推荐

  • Cookies 和 Session的区别

    1 cookie 是一种发送到 客户 浏览器的文本串句柄 xff0c 并保存在客户机硬盘上 xff0c 可以用来在某个WEB站点会话间持久的保持数据 2 session 其实指的就是访问者从到达某个特定主页到离开为止的那段时间 Sessio
  • HashMap详解

    HashMap 16 xff0c 0 75 为什么能快速查找 xff1f put操作放入key时 获取key的hash值 在原始hash值的基础上再次获取hash值 二次hash值与容量取模运算 capacity 获得桶下标 根据桶下标 x
  • 设计模式——单例模式

    单例模式 饿汉式 类加载阶段被初始化就会创建实例 提前创建 span class token keyword class span span class token class name Singleton span span class
  • Java多线程

    并发 线程状态 Debug调试 xff0c 线程模式 java xff1a 6种状态 NEW 新建 startRUNNABLE 就绪 运行 阻塞I O cpu 调度TERMINATED 终结 代码执行完毕BLOCKED 阻塞 获取锁失败WA
  • JVM垃圾回收

    GC与分代回收算法 GC目的 xff1a 实现无用对内存自动释放 xff0c 减少内存碎片 加快分配速度 GC要点 xff1a 回收区域 xff1a 堆内存可达性分析算法 三色标记法GC具体实现称垃圾回收器GC采用分代回收思想 xff0c
  • 4种对象引用类型

    1 强引用 A a 61 new A 通过GC Root的引用链 xff0c 如果强引用不到该对象 xff0c 该对象才会被回收 2 软引用 SoftReference a 61 new SoftReference new A 如果仅有软引
  • SQL语句

    Select SQL 执行顺序 fromonjoinwheregroup byhavingselectdistinctorder bylimit WHERE 字段比较 代码作用 61 等于 lt gt 61 不等于 lt lt 61 小于
  • Bootstrap笔记

    Bootstrap样式 CSS导入 span class token tag span class token tag span class token punctuation lt span link span span class to
  • JSTL与EL表达式

    什么是JSTL JSTL是对EL表达式的扩展 xff0c JSTL是标签语言 xff01 规范了每个标签的职责范围 JSTL标签库 core 核心标签库 fmt 格式化标签库 导标签包 span class token operator l
  • Ubuntu中/usr/local 和 ~/.local 之间的区别

    Ubuntu中 usr local 和 local 之间的区别 usr local 是一个可供所有用户使用的软件可由管理员安装的地方 local bin 是一个用户可以安装软件供自己使用的地方 不同发行版和社区使用的目录结构的历史有些混乱
  • Centos7配置yum镜像源(base,extras,updates,epel,local)

    一 备份默认源 由于默认源都在国外 xff0c 速度非常慢 xff0c 需要把默认的源配置文件备份后删除 span class token comment 进入配置文件目录 span span class token function cd
  • win10彻底关闭windows update 自动更新的方法

    转载自 xff1a https jingyan baidu com article 6181c3e0d75aaa152ef15326 html 其实保留更新还是很有用的 xff0c 毕竟官方一直在修复漏洞 但是服务器虚拟机中运行的win10
  • 解决Centos 7 VNC黑屏

    在配置Centos 7下VNC时发现root用户可以正常登陆VNC桌面 xff0c 而普通用户VNC桌面黑屏 xff0c 分析 vnc xstarup 后发现是普通用户没有执行 etc X11 xinit xinitrc的权限 bin sh
  • 一个与cni0相关的pod创建问题

    今天查看k8s xff0c 发现有个coredns的pod创建失败 xff0c 查看这个POD的信息 xff0c 显示如下错误 combined from similar events Failed to create pod sandbo
  • Debian10安装SSH、配置NTP、安装配置UFW防火墙、配置PATH

    一 SSH安装配置 1 1 安装SSH span class token comment 安装SSH客户端 span apt span class token function install span openssh client spa
  • Debian10 创建用户、用户组、切换用户

    span class token comment 新建用户组 span span class token function groupadd span hausers span class token comment 新建用户并加入用户组
  • C++关于循环依赖的问题

    C 43 43 关于循环依赖的问题 xff1a 循环情况 xff1a class B class A public B b class B public A a 若两个类之间存在循环依赖则在编译时会报错 xff0c 原因是两个类中存在相互的
  • Rust小项目一:Rust 网络编程,实现一个Tcp server

    近日学习Substrate的开发入门 xff0c 之前没有接触过Rust编程 xff0c 今天跟着视频做个小项目练练手 项目目标 xff1a 编写一个Tcp server端与一个Tcp client端 xff0c 客户端中输入内容后 xff
  • Python 项目打包并发布到私有 PyPI 服务器

    推广博客 xff1a Python 项目打包并发布到私有 PyPI 服务器
  • C++ 零碎特性

    摘自 C 43 43 17 入门经典 几乎不会再更新 文章目录 使用花括号初始化变量零初始化使大整型字面量更加易读二进制的整型字面量 96 size t 96 类型浮点数的特殊情况 xff1a NaN xff08 Not a Number