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

《C++ Primer Plus》第18章:探讨 C++ 新标准(8)

  1. 使用大括号括起的初始化列表语法重写下述代码。重写后的代码不应使用数组 ar:

    class Z200 {
    private:int j;char ch;double z;
    public:Z200(int jv, char chv, zv) : j(jv), ch(chv), z(zv) {}
    ...
    };double x = 8.8;
    std::string s = "What a bracing effect!";
    int k(99);
    Z200 zip(200, 'Z', 0.675);
    std::vector<int> ai(5);
    int ar[5] = { 3, 9, 4, 7, 1 };
    for (auto pt = ai.begin(), int i = 0; pt != ai.end(); ++pt, ++i)*pt = ai[i];
    

    答:

    class Z200 {
    private:int j;char ch;double z;
    public:Z200(int jv, char chv, zv) : j(jv), ch(chv), z(zv) {}
    ...
    };double x {8.8};
    std::string s { "What a bracing effect!" };
    int k{99};
    Z200 zip{200, 'Z', 0.675};
    std::vector<int> ai  { 3, 9, 4, 7, 1 };
    
  2. 在下述简短的程序中,哪些函数调用不对?为什么?对于合法的函数调用,指出其引用参数指向的是什么。

    #include <iostream>
    using namespace std;double up(double x) { return 2.0 * x; }
    void r1(const double &rx) { cout << rx << endl; }
    void r2(double &rx) { cout << rx << endl; }
    void r3(double &&rx) {cout << rx << endl; }int main() {double w = 10.0;r1(w);r1(w+1);r1(up(w));r2(w);r2(w+1);r2(up(w));r3(w);r3(w+1);r3(up(w));return 0;
    }
    

    答:

    r1(w)合法,形参 rx 指向 w。
    r1(w+1)合法,形参 rx 指向一个被初始化为 w+1 的临时变量。
    r1(up(w))合法,形参 rx 指向一个被初始化为 up(w) 返回值的临时变量。
    r2(w)合法,形参 rx 指向 w。
    r2(w+1)非法,因为 w+1 是一个右值。
    r2(up(w))非法,因为 up(w) 的返回值是一个右值。
    r3(w)非法,因为右值引用不能指向左值(如w)。
    r3(w+1)合法,rx指向表达式w+1的临时拷贝。
    r3(up(w))合法,rx 指向 up(w) 的临时返回值。
    
  3. a. 下述简短的程序显示什么?为什么?

    #include<iostream>
    using namespace std;double up(double x) { return 2.0 * x; }void r1(const double &rx) { cout << "const double & rx\n"; }
    void r1(double &rx) { cout << "double & rx\n"; }int main() {double w = 10.0;r1(w);r1(w+1);r1(up(w));return 0;
    }
    

    答:

    double & rx
    const double &rx
    const double &rx
    

    w 是左值,与左值引用匹配,w+1和up(w)是右值,但const 引用可以构建关于它们的临时变量,然后指向临时变量。

    b. 下述简短的程序显示什么?为什么?

    #include<iostream>
    using namespace std;double up(double x) { return 2.0 * x; }void r1(double &rx) { cout << "double & rx\n"; }
    void r1(double &&rx) { cout << "double && rx\n"; }int main() {double w = 10.0;r1(w);r1(w+1);r1(up(w));return 0;
    }
    

    答:

    double & rx
    double && rx
    double && rx
    

    左值引用与左值实参 w 匹配,而右值引用与两个右值实参匹配。

    c. 下述简短的程序显示什么?为什么?

    #include<iostream>
    using namespace std;double up(double x) { return 2.0 * x; }void r1(const double &rx) { cout << "const double & rx\n"; }
    void r1(double &&rx) { cout << "double && rx\n"; }int main() {double w = 10.0;r1(w);r1(w+1);r1(up(w));return 0;
    }
    

    答:

    const double & rx
    double && rx
    double && rx
    

    const 左值引用与左值实参匹配,而右值引用与两个右值实参匹配。

    总之,非const左值形参,只能匹配左值实参;非const 右值形参只能匹配右值实参;const 左值可与左值或右值形参匹配,但如果与前两种方式同时存在,编译器优先选择前两种方式。

  4. 哪些成员函数是特殊的成员函数?它们特殊的原因是什么?
    默认构造函数、默认复制构造函数、默认移动构造函数、默认析构函数、默认复制赋值运算符和默认移动赋值运算符。这些函数之所以特殊,是因为编译器将根据情况自动提供它们的默认版本。

  5. 假设 Fizzle 类只有如下所示的数据成员:

    class Fizzle {
    private:double bubbles[4000];
    ...
    };
    

    为什么不适合给这个类定义移动构造函数?要让这个类适合定义移动构造函数,应如何修改存储 4000 个 double 值的方式?

    答:在转让数据所有权(而不是复制数据)可行时,可使用移动构造函数,但对于标准数组,没有转让其所有权的机制。如果 Fizzle 使用指针和动态内存分配,则可将数据的地址赋给新指针,以转让其所有权。

  6. 修改下述简短的程序,使其使用 lambda 表达式而不是 f1()。请不要修改 show2()。

    #include <iostream>
    template <typename T>
    void show2(double x, T & fp) {std::cout << x << " -> " << fp(x) << '\n';
    }
    double f1(double x) {return 1.8 * x + 32;
    }
    int main() {show2(18.0, f1);return 0;
    }
    

    答:

    #include <iostream>
    template <typename T>
    void show2(double x, T & fp) {std::cout << x << " -> " << fp(x) << '\n';
    }
    int main() {show2(18.0, [](double x){return 1.8 * x + 32;} );return 0;
    }
    
  7. 修改下述简短而丑陋的程序,使其使用 lambda 表达式而不是函数符 Adder。请不要修改 sum()。

    #include<iostream>
    #include<array>
    const int Size = 5;
    template<typename T>
    void sum(std::array<double, Size> a, T& fp);class Adder {double tot;
    public:Adder(double q = 0) : tot(q) {}void operator() (double w) { tot += w; }double tot_v() const { return tot; }
    };int main() {double total = 0.0;Adder ad(total);std::array<double, Size> temp_c = {32.1, 34.3, 37.8, 35.2, 34.7 };sum(temp_c, ad);total = ad.tot_v();std::cout << "total: " << ad.tot_v() << '\n';return 0;
    }template<typename T>
    void sum(std::array<double, Size> a, T& fp) {for (auto pt = a.begin(); pt != a.end(); ++pt) {fp(*pt);}
    }
    

    答:

    #include<iostream>
    #include<array>
    const int Size = 5;
    template<typename T>
    void sum(std::array<double, Size> a, T& fp);int main() {double total = 0.0;std::array<double, Size> temp_c = {32.1, 34.3, 37.8, 35.2, 34.7 };sum(temp_c, [&total](double w) { total += w; });std::cout << "total: " << total << '\n';return 0;
    }template<typename T>
    void sum(std::array<double, Size> a, T& fp) {for (auto pt = a.begin(); pt != a.end(); ++pt) {fp(*pt);}
    }
    

相关文章:

《C++ Primer Plus》第18章:探讨 C++ 新标准(8)

使用大括号括起的初始化列表语法重写下述代码。重写后的代码不应使用数组 ar&#xff1a; class Z200 { private:int j;char ch;double z; public:Z200(int jv, char chv, zv) : j(jv), ch(chv), z(zv) {} ... };double x 8.8; std::string s "What a bracing effect!&q…...

YOLO-V5 系列算法和代码解析(八)—— 模型移植

文章目录工程目标芯片参数查阅官方文档基本流程Python 版工具链安装RKNPU2的编译以及使用方法移植自己训练的模型工程目标 将自己训练的目标检测模型【YOLO-V5s】移植到瑞芯微【3566】芯片平台&#xff0c;使用NPU推理&#xff0c;最终得到正确的结果。整个过程涉及模型量化、…...

js实现复制拷贝的兼容方法

1. 定义复制拷贝的方法 在某个工具类方法中定义该方法&#xff0c;兼容不同浏览器处理 /*** description 拷贝的类方法*/ class CopyClass {// constructor() {}setRange(input) {return new Promise((resolve, reject) > {try {// 创建range对象const range document.c…...

学习 Python 之 Pygame 开发魂斗罗(八)

学习 Python 之 Pygame 开发魂斗罗&#xff08;八&#xff09;继续编写魂斗罗1. 创建敌人类2. 增加敌人移动和显示函数3. 敌人开火4. 修改主函数5. 产生敌人6. 使敌人移动继续编写魂斗罗 在上次的博客学习 Python 之 Pygame 开发魂斗罗&#xff08;七&#xff09;中&#xff0…...

Lesson11---分类问题

11.1 逻辑回归 11.1.1 广义线性回归 课程回顾 线性回归&#xff1a;将自变量和因变量之间的关系&#xff0c;用线性模型来表示&#xff1b;根据已知的样本数据&#xff0c;对未来的、或者未知的数据进行估计 11.1.2 逻辑回归 11.1.2.1 分类问题 分类问题&#xff1a;垃圾…...

Python基础学习12——异常

在Python中&#xff0c;会使用“异常”这个十分特殊的对象来管理程序执行期间发生的错误&#xff0c;即报错。本文将介绍一下python基础的处理异常的方法以及一些基本的异常类型。 异常处理方法 try-except代码块 当我们编写程序时&#xff0c;我们可以编写一个try-except代…...

[日常练习]练习17:链表头插法、尾插法练习

[日常练习]练习17&#xff1a;链表头插法、尾插法练习练习17描述输入输出输入示例1输出示例1输入示例2输出示例2代码演示&#xff1a;总结练习17 【日常练习】 链表头插法、尾插法练习 描述 输入3 4 5 6 7 9999一串整数&#xff0c;9999代表结束&#xff0c;通过头插法新建链…...

第十四届蓝桥杯模拟赛(第三期)试题与题解 C++

目录 一、填空题 &#xff08;一&#xff09;最小的十六进制(答案&#xff1a;2730) &#xff08;二&#xff09;Excel的列(答案&#xff1a;BYT) &#xff08;三&#xff09;相等日期(答案&#xff1a;70910) &#xff08;四&#xff09;多少种取法(答案&#xff1a;189)…...

关于 “宏“

起源 宏 Macro"这个词源于希腊语 “makros”&#xff0c;意为“大的&#xff0c;长的” 延伸使用 随后用于计算机领域是&#xff0c;在汇编语言时用于描述一大堆的汇编指令。 只要用宏指令&#xff0c;就是直接用的一大堆的汇编指令&#xff08;有点函数的味道&#xf…...

1.2 CSS标签选择器,类选择器

CSS选择器&#xff1a; 根据不同的需求选出不同的标签&#xff0c;进行美化装饰 1. 标签选择器 标签选择器(元素选择器)&#xff1a;用 HTML标签名作为选择器&#xff0c;按标签名称进行分类&#xff0c;为页面某一类标签指定统一的CSS样式 作用: 可以把某一类标签全部选中&…...

【Linux】进程等待 | 详解 wait/waitpid 的 status 参数

&#x1f923; 爆笑教程 &#x1f449; 《看表情包学Linux》&#x1f448; 猛戳订阅 &#x1f525; &#x1f4ad; 写在前面&#xff1a;在上一章中我们讲解了进程创建与进程终止&#xff0c;本章我们开始讲解进程等待。进程等待这部分知识相较于前面还是较为复杂的&#xff0…...

OpenAI眼中的无线调优策略

问&#xff1a;无线调优策略该怎么优化无线调优是指对无线网络的各种参数进行优化&#xff0c;以提高网络性能和用户体验。以下是几个无线调优策略&#xff1a;频谱分配&#xff1a;通过优化频谱的分配&#xff0c;可以提高网络的容量和覆盖范围。在频谱分配时&#xff0c;需要…...

DataX入门

目录 1. DataX介绍 2. DataX支持的常用数据源类型 3. 设计理念 4. DataX框架设计 4.1. Reader 4.2. Writer 4.3. Framework 5. DataX的运行流程 6. DataX与Sqoop对比 7. 部署 8. 配置详解 9. 案例 同步MySql到HDFS 9.1. 整体结构 9.2. mySqlReader 9.2.1. …...

第二章SpringBoot基础学习

文章目录SpringBoot依赖管理特性依赖管理开发导入starter场景启动器SpringBoot自动配置特性自动配好Tomcat自动配好SpringMVC默认的包结构各种配置拥有默认值按需加载所有自动配置项SpringBoot注解底层注解ConfigurationImport导入组件Conditional条件装配ImportResource导入Sp…...

B - Build Roads (最小生成树 + 打表)

https://vjudge.net/problem/Gym-103118B/origin 在猫的国度里&#xff0c;有n个城市。猫国国王想要修n -1条路来连接所有的城市。第i市有一家ai经验价值的建筑公司。要在第i市和第j市之间修建公路&#xff0c;两个城市的建筑公司需要相互合作。但是&#xff0c;在修路的过程中…...

k8s管理工具

k8s管理工具 文章目录k8s管理工具Kuboard&#xff08;&#x1f495;17.3k&#xff09;KubeOperator&#xff08;&#x1f495;4.6k&#xff09;Rainbond&#xff08;&#x1f495;3.8k&#xff09;KubeSphere&#xff08;&#x1f495;12k&#xff09;Kuboard&#xff08;&…...

Cannot start compiler The output path is not specified for module mystatic(已解决)

1.背景&#xff1a;今天在idea上写了一些代码&#xff0c;右键run竟然跑不起来了&#xff0c;而且右下角的Event Log还报错。报错内容如下图&#xff1a;2.报错原因&#xff1a;项目代码和编译器的输出路径不在一块&#xff0c;导致idea无法找到模块的output path&#xff08;输…...

python入门应该怎么学习

国外Python的使用率非常高&#xff0c;但在国内Python是近几年才火起来&#xff0c;Python正处于高速上升期市场对于Python开发人才的需求量急剧增加&#xff0c;学习Python的前景比较好。 Python应用领域广泛&#xff0c;意味着选择Python的同学在学成之后可选择的就业领域有…...

不懂命令, 如何将代码托管到Gitee上

1.注册码云注册地址 : https://gitee.com2. 新建仓库第一步 : 创建仓库第二步 : 给仓库起名字创建好仓库后, 我们就有了一个网络上的仓库 : 3. 将网络上的仓库克隆到本地在克隆仓库之前, 我们需要先在电脑上安装以下两个工具 >>这两个软件一定要按顺序安装, 先安装第一个…...

Mysql常见面试题总结

1、什么是存储引擎 存储引擎指定了表的类型&#xff0c;即如何存储和索引数据&#xff0c;是否支持事务&#xff0c;同时存储引擎也决定了表在计算机中的存储方式。 2、查看数据库支持哪些存储引擎使用什么命令&#xff1f; -- 查看数据库支持的存储引擎 show engines; 或者 …...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...