C++学习笔记02-结构基础(问题-解答自查版)

前言

以下问题以Q&A形式记录,基本上都是笔者在初学一轮后,掌握不牢或者频繁忘记的点

Q&A的形式有助于学习过程中时刻关注自己的输入与输出关系,也适合做查漏补缺和复盘。

本文对读者可以用作自查,答案在后面,需要时自行对照。

--

问题集

## 2022年6月9日 -《C++ Primer plus》第5~8章

Q1:下面语句的执行结果?(注意:逗号的优先级)

        int cats = 17, 240;

        int cats = (17, 240);

Q2:以下两个C++函数的定义?哪个正确?

        void sum_arr(int iarray[], int n){ }void sum_arr(int[] iarray, int n){ }

Q3:手写迭代器,代码中 const int *i 是什么含义?

void print_arr(const int * begin, const int * end){for (const int *i = begin; i != end; i++) cout << *i << " ";}int main(){int arr[arrSize]= {1,2,3,4,5,6,7};print_arr(arr, arr + arrSize);   //优点:从 地址begin~地址end 的遍历}

Q4:C++中,这样能修改const变量吗?

        const float gmoon =1.63;

        float *pm = &g_moon;

Q5:如何定义一个第一个参数接受二维数组的函数体?:int sum(  ,int size)

Q6:函数探幽——引用的本质?可以有空引用吗?

Q7:如何理解引用将两个变量 wallet1和wallet2 产生交换?

Q8: double refcube (const double &ra ); 入参 声明成这样有什么作用?

Q9:已知 double refcube (const double &ra ); 函数声明

        double z = refcube (x + 3.0); 这个调用正确吗?

         (注意本eg中:x是一个引用型double变量)

Q10:C++中,比较严谨的左值定义?

        另外地,有没有简单粗暴的理解方法?

Q11:已知 double refcube (double &ra ); 函数声明。

        什么时候编译器会让ra默认创建临时变量?(了解即可)

Q12:右值引用如何声明?一种特殊语法,使用在什么地方?

Q13:函数返回结构体引用变量的目的是什么?

Q14:将类对象传递给函数时,C++通常的做法是使用()

Q15:这个函数重载的方式正确吗?

 Q16:这个函数重载的是否正确?

        int func(int a);

        int func(const int a);

Q17:模版函数的两种写法?

Q18:显式模板化是什么?其函数的声明?

Q19:重载匹配的规则?

Q20:cout << lesser<> (m, n) << endl ;  这个语法是什么意思?

Q21:函数模板中遇到未知变量类型,该使用何种关键字进行?

ps:这个情境最主要是因为模版无法预知入参运算的结果,比如 int+float 和 int+long 就很不同

参考解答

Q1:下面语句的执行结果?

        int cats = 17, 240;

        int cats = (17, 240);

A1:

 Q2:以下两个C++函数的定义?哪个正确?

        void sum_arr(int iarray[], int n){ }void sum_arr(int[] iarray, int n){ }

函数的入参为数组的时候,入参应被视为数组本身,还是数组首地址?

A2:void sum_arr(int iarray[], int n){ }正确;

根据C++规则,入参为数组,入参 int iarray[] = 数组名 = 函数指针 = 其第一个元素的地址

也就是说:函数传递的实则为地址

这里补充了一个实验:

void sum_arr(int iarray[], int n){cout << 1;}void sum_arr(int * iarray, int n){cout << 2;}

在这段代码中,函数 sum_arr 并不视为两种重载,而是视为重复定义,也就是其本质一样

void sum_arr(int iarray[ ], int n) 实际在编译时被转换成了 → void sum_arr(int * iarray, int n)

注意:在C++中,当且仅当用于函数头或函数原型中,int *arr 和 int arr []的含义才是相同的。它们都意味着 arr 是一个 int 指针。

  

 Q3:手写迭代器,代码中 const int *i 是什么含义?

void print_arr(const int * begin, const int * end){for (const int *i = begin; i != end; i++) cout << *i << " ";}int main(){int arr[arrSize]= {1,2,3,4,5,6,7};print_arr(arr, arr + arrSize);   //优点:从 地址begin~地址end 的遍历}

A3:const int *i 表示一个 指向 const int 的指针,意味着这个指针的位置不会发生改变。

Q4:这样能修改const变量吗?

        const float gmoon =1.63;

        float *pm = &g_moon;

A4:不可以,语法上直接报错,其正确格式:

        const float gmoon = 1.63;

        const float *pm = &g_moon;

C++禁止将 const 的地址赋给非 const 指针。// error: invalid conversion from 'const char*' to 'char*' [-fpermissive]

如果读者非要这样做,可以使用强制类型转换来突破这种限制,详情请参阅第15章中对运算符const_cast 的讨论,这个东西专门用来突破const界限。

Q5:如何定义一个第一个参数接受二维数组的函数体?:int sum(  ,int size)

A5:如下

ar2是指针而不是数组。还需注意的是,指针类型指出,它指向由 4 个int组成的数组

因此,指针类型指定了列数,这就是没有将列数作为独立的函数参数进行传递的原因。

Q6:函数探幽——引用的本质?可以有空引用吗?

A6:给变量取别名;

引用变量的主要用途是用作函数的形参,引用变量用作参数,函数将使用原始数据,而不是其副本

引用要求初始化的时候就产生“绑定”,不能跳过初始化。这个特性比较类似const指针

Q7:如何理解引用将两个变量 wallet1和wallet2 产生交换?

A7:在swapr()中,变量a和b是 wallet1 和 wallet2 的别名,所以交换a和b的值相当于交换 wallet1 和 wallet2 的值;

注意:引用是别名,而不是地址只是提供了一种方式来访问和操作它所绑定的对象。

这里有个习作,看看能不能看懂:

    int man = 233;        // 定义manint & robot = man;    // 定义引用变量 robot,绑定man,以后robot就是man的别名了vplus(robot);         // 给robot表示的变量输入vplus函数cout << man;         }void vplus (int & value){    // vplus:给入参表示的变量++; 即:给value表示的robot表示的man变量++value ++;                // 实际上,robot,man和vplus运行中的value指向了同一个值}

Q8: double refcube (const double &ra ); 参数 声明成这样有什么作用?

A8:声明引用变量 &ra 是不可变的引用。引用型变量如果在函数体内部变来变去,外面的值也就发生变化了。

这个功能对于 ra 是一个double而言,实际上和值传递没有区别。

这个功能最有用的地方是用来引用struct或者class,如下:

之后在其中不用指针操作,而是可以直接在函数体内写 ft.name = "Joe"

Q9:接上面,已知 double refcube (const double &ra ); 声明

        double z = refcube (x + 3.0); 这个调用正确吗? (本eg:x是一个非const 的 double 引用变量)

A9:不正确,因为x+3不是一个变量。

        这里涉及了一个不容易被注意的规则:如果实参(double)与引用参数(const double &)不匹配,C++将生成临时变量。(具体的规则可以看Q11)

Q10:C++中,比较严谨的左值定义?

A10:定义比较简单,主要基于是否可被赋值,int a,以及 const int a; 都可以被视作左值

        较为粗暴的理解:

        C++中所有值必然属于左值或者右值
        在C++11中可以取地址的、有名字的就是左值
        反之,不能取地址的、没有名字的就是右值

Q11:已知 double refcube (double &ra ); 声明

        什么时候会让ra默认创建临时变量?(编译器差异,了解即可)

A11:目前,这种语法如果使用右值,已经不再是告警,而是直接报错:包括下面 c++ prime plus 书中的案例

旧版本两种情况:

        1)实参的类型正确,但不是左值;

        2)实参的类型不正确,但可以转换为正确的类型。

        总而言之,就是需要临时整一下,不能直接提供。

Q12:右值引用如何声明?一种特殊语法,使用在什么地方?

A12:用&&声明,

    int && ref = 7;

    cout << ref << endl;

允许将资源(如内存、文件句柄等)从临时对象转移到新对象,实现移动语义

Q13:函数返回结构体引用变量的目的是什么?

A13:为了效率,少一次拷贝。

Q14:将类对象传递给函数时,C++通常的做法是使用()

A14:引用

Q15:这个函数重载的方式正确吗?

A15:不正确。

Q16:这个函数重载的是否正确?

        int func(int a);

        int func(const int a);

A16:不正确,const 不会被认作区分。

Q17:模版函数的两种写法?

A17:

template <typename T>;

或者 template <class T>;  // 后者C++98老式风格

void Swap(T &a,T &b) ;

Q18:显式模板化是什么?其函数的声明?

A18:

Q19:重载匹配的规则?

A19:哪个最接近匹配哪个。默认优先级:正常函数 > 模版函数

Q20:cout << lesser<> (m, n) << endl ;  这个语法是什么意思?

A20:主要是对于有函数模板和正常函数并存的情况,手动选择函数模板。

Q21:函数模板中遇到未知变量类型,该使用何种关键字进行?

ps:这个情境最主要是因为模版无法预知入参运算的结果,比如 int+float 和 int+long 就很不同

A21:通过关键字 decltype(x) y ,make y's type same as x;这个语法有点 auto y as x 的意思;

decltype 的内在本质是一个查表逻辑

Q22:函数模板中遇到未知返回值类型,该使用何种关键字进行?

ps:比起上一个问题,这个的难度在于考虑 x和y 甚至没有声明,编译器一无所知

后置返回类型 的内在本质是让 x和y 两个入参具备了作用域前提

A22:auto func()  -> TYPE,

// 这里的 TYPE 可以是传统类型,也可以是 decltype(入参)

经测验,这个代码可以运行正常(没有用decltype):

template <typename T1, typename T2>

auto add(T1 a, T2 b){     //   auto add(T1 a, T2 b)  -> decltype(a+b)  is also correct

    return a+b;

}

int main(){

    int a = add(5,6);

    double b = add(5, 6.2);

    cout << a << endl;

    cout << b << endl;

}

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

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

相关文章

【Linux】HTTP 协议

目录 1. URL2. HTTP 协议2.1. HTTP 请求2.2. HTTP 响应 1. URL URL 表示着是统一资源定位符(Uniform Resource Locator), 就是 web 地址&#xff0c;俗称“网址”; 每个有效的 URL 可以通过互联网访问唯一的资源, 是互联网上标准资源的地址; URL 的主要由四个部分组成: sche…

学习测试10-3自动化 web自动化

web自动化 chrome驱动下载地址&#xff1a; https://registry.npmmirror.com/binary.html?pathchromedriver/ https://googlechromelabs.github.io/chrome-for-testing/#stable观察Google版本&#xff0c;下相应的驱动 运行代码试试&#xff0c;成功Google就会弹出 from se…

华为OD机试2024年C卷D卷 - 山脉的个数/攀登者1 (Java)

华为OD机试&#xff08;C卷D卷&#xff09;2024真题目录 题目描述 攀登者喜欢寻找各种地图&#xff0c;并且尝试攀登到最高的山峰。 地图表示为一维数组&#xff0c;数组的索引代表水平位置&#xff0c;数组的元素代表相对海拔高度。其中数组元素0代表地面。 例如&#xff…

ARM 单片机裸机任务调度框架

前言&#xff1a; 在没有使用操作系统的情况下&#xff0c;一个合理的裸机任务调度方式&#xff0c;可以更好的提供数据的处理&#xff0c;和用户体验&#xff0c;有多种任务调度的方式。 方案 1&#xff1a; 从上到下的任务调度方式&#xff0c;C语言程序的代码是在main函数…

K8S 上部署 Prometheus + Grafana

文章目录 一、使用 Helm 安装 Prometheus1. 配置源2. 下载 prometheus 包3. 安装 prometheus4. 卸载 二、使用 Helm 安装 Grafana1. 配置源2. 安装 grafana3. 访问4. 卸载 一、使用 Helm 安装 Prometheus 1. 配置源 地址&#xff1a;https://artifacthub.io/packages/helm/pro…

[路由器]IP-MAC的绑定与取消

背景&#xff1a;当公司的网络不想与外部人员进行共享&#xff0c;可以在路由器页面配置IP-MAC的绑定&#xff0c;让公司内部人员的手机和电脑的mac&#xff0c;才能接入到公司。第一步&#xff1a;在ARP防护中&#xff0c;启动IP-MAC绑定选项&#xff0c;必须启动仅允许IP-MAC…

linux、windows、macos清空本地DNS缓存

文章目录 Linux&#xff1a;Windows&#xff1a;macOS&#xff1a; Linux&#xff1a; 对于使用systemd的操作系统&#xff08;如CentOS 7、Ubuntu 16.04&#xff09;&#xff0c;可以使用以下命令重启systemd-resolved服务来清除缓存&#xff1a; sudo systemctl restart sys…

【ELK】window下ELK的安装与部署

ELK的安装与部署 1. 下载2. 配置&启动2.1 elasticsarch2.1.1 生成证书2.1.2 生成秘钥2.1.3 将凭证迁移到指定目录2.1.4 改配置2.1.5 启动2.1.6 访问测试2.1.7 生成kibana账号 2.2 kibana2.2.1 改配置2.2.2 启动2.2.3 访问测试 2.3 logstash2.3.1 改配置2.3.2 启动 2.4 file…

你了解你的GD32 MCU系统主频是多少吗 ?

系统时钟是GD32 MCU的时基&#xff0c;可以理解为系统的心跳&#xff0c;片上所有的外设以及CPU最原始的时钟都来自于系统时钟&#xff0c;因而明确当前系统时钟是多少非常重要&#xff0c;只有明确了系统时钟&#xff0c;才能够实现准确的定时、准确的采样间隔以及准确的通信速…

通过QT基于C++实现串口通信

1.软件下载 本文所用到的所有软件都在以下连接可以下载 QT下载&#xff08;注意下载路径最好全英&#xff0c;不要出现中文容易有bug&#xff09; 链接&#xff1a;https://pan.baidu.com/s/1XCPlTBQ8fBOKBYO-H0mSVg?pwdm28f 提取码&#xff1a;m28f 串口工具下载 链接&…

二十、Qt位置相关函数

目录 一、函数概述 二、函数实践 三、总结 一、函数概述 Qt 提供了很多关于获取窗体位置及显示区域大小的函数&#xff0c;如 x()、y()和 pos()、react()、size()、geometry()等&#xff0c;统称为“位置相关函数”或“位置函数”&#xff0c; 如下图所示是几种主要的位置函数…

JS 鼠标拖动实现移动滚动条的滚动效果

效果 现在很多场景都以移动端为基本开发&#xff0c;比如说需要隐藏滚动条&#xff0c;在pc上实现鼠标拖动和手机触摸拖动差不多的效果。 实现 以mdn的overflow属性中范例为基础&#xff0c;内容溢出时候可使用overflow: auto;和overflow: scroll;实现滚动效果。 要实现鼠标…

华为防火墙总部与分支机构建立IPsec VPN涉及NAT穿越

一、IPsec VPN基本概念 1、隧道建立方式&#xff1a;分为手动建立和IKE自动协商&#xff0c;手动建立需要人为配置指定所有IPsec建立的所有参数信息&#xff0c;不支持为动态地址的发起方&#xff0c;实际网络中很少应用&#xff1b;IKE协议是基于密钥管理协议ISAKMP框架设计而…

一文看懂AI的 Transformer 架构!

1 AI的转换器是啥&#xff1f; 转换器&#xff0c;一种将输入序列转换或更改为输出序列的神经网络架构。它们通过学习上下文和跟踪序列组件之间的关系来做到这一点。例如&#xff0c;请考虑以下输入序列&#xff1a;“天空是什么颜色的&#xff1f;” 转换器模型会使用内部数学…

C4D2024软件下载+自学C4D 从入门到精通【学习视频教程全集】+【素材笔记】

软件介绍与下载&#xff1a; 链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1n8cripcv6ZTx4TBNj5N04g?pwdhfg5 提取码&#xff1a;hfg5 基础命令的讲解&#xff1a; 掌握软件界面和基础操作界面。学习常用的基础命令&#xff0c;如建模、材质、灯光、摄像机…

TypeScript体操(一):从基础到进阶

目录 前言Utility Types 是什么&#xff1f;常用 Utility Types前置知识typeofkeyoftypeof 和 keyof 的区别never 关键字extends 关键字结合条件判断infer 类型推断&#xff08;模式匹配&#xff09;判断是与非判断两个类型是否相等或兼容 循环递归嵌套字符串数组协变&#xff…

NMEA2000在船舶控制系统中航空插头插座组件特性

NMEA2000在船舶控制系统中的应用概述 NMEA2000协议是船舶电子设备之间通信的国际标准&#xff0c;广泛应用于船舶导航、监控和自动化系统。它基于CAN&#xff08;Controller Area Network&#xff09;总线技术&#xff0c;以确保在恶劣环境下的可靠性和效率。NMEA2000协议定义了…

英语语法第八课副词

文章目录 1、副词分类1.1 时间副词&#xff0c;表示时间或频率1.2 地点副词&#xff0c;表示地点或位置1.3 方式副词&#xff0c;表示行为方式1.4 程度副词&#xff0c;表示动作程度1.5 疑问副词&#xff0c;引导特殊疑问句1.6 强调副词&#xff0c;强调形容词或动词1.7 连接副…

隐语隐私计算实训营「联邦学习」第 5 课:基于隐私保护的机器学习算法介绍

【隐私计算实训营】是蚂蚁集团隐语开源社区出品的线上课程&#xff0c;自实训营上线以来&#xff0c;获得行业内外广泛关注&#xff0c;吸引上千余名开发者报名参与。本次暑期夏令营课程中&#xff0c;除了最新上线的「联邦学习系列」&#xff0c;还包含了「隐私保护数据分析」…

Java项目实战springboot校园失物招领系统

✌网站介绍&#xff1a;✌10年项目辅导经验、专注于计算机技术领域学生项目实战辅导。 ✌服务范围&#xff1a;Java(SpringBoo/SSM)、Python、PHP、Nodejs、爬虫、数据可视化、小程序、安卓app、大数据等设计与开发。 ✌服务内容&#xff1a;免费功能设计、免费提供开题答辩P…