C++Primer(4-8章)

2023-11-17

第四章:表达式

求值顺序

在这里插入图片描述
C++中没有明确规定大多数运算符的求值顺序,因此我们要避免:改变了某个运算对象的值,又在表达式其他地方使用这个运算对象。这种情况出现。

赋值运算满足右结合律。

在输出表达式中使用条件运算符:
条件运算符的优先级非常低,因此需要在两端加上括号。
在这里插入图片描述

在第二条表达式中,等价于。
在这里插入图片描述

类型转换

如果类型之间有关联,那么当程序需要一种类型的运算对象时,可以用另一种关联类型的对象或值来替代。如果两种类型可以相互转换,就是有关联的。

何时发生隐式类型转换

1.在多数表达式中,比int类型小的整数首先提升为较大的整数类型。
2.在条件中,非布尔值转换为布尔值。
3.在赋值语句中,右侧运算对象转换为左侧运算对象的类型。
4.如果算术运算或者关系运算的对象有多种类型,需要转换成同一种类型。

强制类型转换(cast)

强制转换的格式如下:
cast-name< type> (expression)
其中,type是转换的目标类型,expression是要转换的值。cast-name有如下几种类型。
static-cast
任何具有明确定义的类型转换,只要不包含底层const,都可以用static-cast。
const-cast

只能改变运算对象的底层const,用于将常量对象转换成费常量的对象。

第五章:语句

控制语句

switch语句的case标签必须是整型常量表达式。也就是说只可以用整数或者字符型常量。

第六章:函数

局部静态对象:

有些时候,有必要令局部变量的生命周期贯穿函数调用及之后的时间。因此可以将变量定义为static类型。局部静态对象在程序的执行路径第一次经过对象定义语句时候初始化,直到程序终止才被销毁,在此期间即使对象所在的函数结束执行也不会对它有影响。

参数传递

和其他变量一样,形参的类型决定了形参和实参交互的方式。如果形参是引用类型,它将绑定到对应的实参上;否则,将实参的值拷贝后赋给形参。
当形参是引用类型时,我们说它对应的实参被引用传递,也就是说,引用形参是它对应的实参的别名。
当实参的值被拷贝给形参时,形参和实参是两个独立的对象。

return语句

引用返回左值

可以像使用其他左值那样来使用返回引用的函数的调用。特别的,我们能为返回类型非常量引用的函数的结果赋值。
在这里插入图片描述
不过,如果返回类型是常量引用,我们则不可以作为左值。

列表初始化返回值

C++11规定,函数可以返回花括号包围的值的列表。如果函数返回的是容器,列表中可以有多个值。如果返回的是内置类型,最多包含一个值。如果返回的是类类型,由类本身定义初始值如何使用。

返回数组指针

因为数组不能被拷贝,所以函数不能返回数组。不过可以返回数组的指针或引用。
在这里插入图片描述
为了返回函数指针,我们需要声明一个返回函数指针的函数。但是,我们可以使用类型别名来简化该操作,定义类型别名有以上两种方法。
arrT和arrT1是含有10个int整数的数组的别名。func函数接受一个int实参,返回一个指向含有10个整数的数组的指针。

返回函数指针的函数
在这里插入图片描述
和这些声明类似,我们想定义一个返回数组指针的函数,则必须含有数组的维度,我们可以用如下方法。

使用尾置数据类型
任何函数都可以使用尾置返回,但是这种形式对返回类型复杂的函数最有效。
尾置返回类型跟在形参列表后面并以->符号开头。为了表示函数真正的返回类型跟在形参列表之后,我们在本应该放返回类型的地方设置一个auto,如下:
在这里插入图片描述

assert宏

头文件是cassert,assert宏使用一个表达式作为它的条件:assert(expr);
首先对expr求值,如果为假(0),assert输出信息并终止程序运行,为真则什么也不做。
assert宏常用于检查不能发生的条件。

函数指针

函数指针指向的是函数而非对象,和其他指针一样,函数指针指向某种特定类型。
例如:
在这里插入图片描述

使用函数指针

在这里插入图片描述
如果定义了指向重载函数的指针,指针类型必须与重载函数中的某一个精确匹配。

函数指针形参
在这里插入图片描述
虽然不能定义函数类型的形参,但是形参可以是指向函数的指针。此时,形参是当成指针使用。
因此,我们可以直接把函数作为实参使用,此时会自动转换为指针。
useBigger(s1, s2, lengthCompare);

返回指向函数的指针
写法如下:
在这里插入图片描述

第七章:类

this常量指针

成员函数通过一个名为this的额外的隐式参数来访问调用它的那个对象。当我们调用一个成员函数时,用请求该函数的对象地址初始化this。
例如,我们调用total.isbn() ,则编译器将total的地址传递给isbn的隐式形参this,等价于Sales_data::isbn(&total)

定义一个返回this对象的函数

Sales_data& Sales_data::combine(const Sales_data &rhs)
	{
		//将rhs的成员加到this对象的成员上
		units_sold += rhs.units_sold;
		revenue += rhs.revenue;
		return *this; //返回调用该函数的对象
	}

其中,return语句解引用this指针以获得执行该函数的对象。

类的静态成员

有时候类的一些成员与类本身相关,而不是与类的各个对象保持关联。
例如,银行账户类需要一个成员来表示当前的利率,我们希望利率与这个类关联,不是与每个银行账户对象关联,没有必要每个对象都存储利率。更重要的是,如果利率变化,我们希望所有的对象都能使用新值。

声明静态成员

在成员的声明前加上关键字static。静态成员可以是public或者private,类型可以是常量、引用、指针、类等。

使用静态成员

我们使用作用域运算符直接访问静态成员。

或者我们可以使用类的对象、引用、指针来访问静态成员

定义静态成员

我们既可以在类的内部也可以在外部定义静态成员函数。在类的外部定义时,不能重复static关键字,该关键字只出现在类内部的声明语句。

第八章:IO库

istream:输入流类型,提供输入操作
ostream:输出流类型,提供输出操作
cin:一个istream对象,从标准输入读出数据
cout:一个ostream对象,向标准输出写入数据
ceer:一个ostream对象,用于输出程序错误消息,写入到标准错误
*>>:用于从一个istream对象中读取输入数据
<<:用来像一个ostream对象写入输出数据
getline:用于从一个给定的istream读取一行数据,存入一个给定的string对象中

刷新输出缓冲区:
endl:换行并刷新缓冲区
flush:刷新缓冲区

文件输入输出

文件模式:
in:以只读方式打开
out:以写方式打开
app:每次写操作前均定位到文件末尾
ate:打开文件后立即定位到文件末尾
trunc:截断文件

以out模式打开文件会丢弃已有数据

默认情况下,当我们打开一个ofstream时,文件内容会被丢弃。阻止一个ofstream清空给定文件内容的方法是同时指定app模式。
ofstream app("file",ofstream::out | ofstream::app);

string流

sstream头文件定义了三个类型来支持内存IO,可以从string读取数据,向string写入数据。
istringstream、ostringstream、stringstream分别是读数据、写数据、既可以读又可以写。

使用istringstream

例如:假设有一个文件,列出了一些人和他们的电话号码。某些人只有一个号码,某些人则有多个号码。我们的输入文件可能是如下的:
morgan 2015151555 674845854854
drew 05855555
lee 4124115677 5345378888 9534534534
文件中每条记录都以一个人名开始,后面跟随一个或多个电话号码。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们先用getline从标准输入读取整条记录,如果调用成功,那么line中将存着从输入文件而来的一条记录。
在while中,我们定义了一个局部PersonInfo存放当前记录的数据。
接下来我们将一个istringstream与刚刚读取的文本行绑定,这样就可以在此istringstream上使用输入运算符来读取当前记录的每个元素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++Primer(4-8章) 的相关文章

  • 从实体获取单列

    如何从查询中获取单个列而不是整个对象 我可以这样做来获取整个对象 但我想要的只是名称 IList
  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • 通过另一个列表更新列表(linq)

    我有类 Data 的对象列表 如下所示 class Data int code string name DateTime date update 我还有另一个课程列表 例如 class RefCodes int old code int n
  • C# 和月历,选择多个日期

    我正在制作一个程序 可以帮助人们用 C 为某个部门 预订 订单 他们需要能够选择不同月份的多个日期 我更愿意拥有它 这样他们就可以单击一个日期 然后按住 Shift 键单击另一个日期以选择这两个日期之间的所有日期 并控制单击以进行单选 取消
  • 为什么在 C++ 中声明枚举时使用 typedef?

    我已经很多年没有写过任何 C 了 现在我正试图重新开始 然后我遇到了这个并考虑放弃 typedef enum TokenType blah1 0x00000000 blah2 0X01000000 blah3 0X02000000 Toke
  • C# Outlook 从收件人获取 CompanyName 属性

    我目前正在使用 C 编写 Outlook 2010 AddIn 我想要的是从我从 AppointmentItem 中提取的 Recipient 对象中获取 CompanyName 属性 因此 有了 AppointmentItem 的收件人
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • MSMQ接收和删除

    是否有任何选项可以在读取消息后将其从 MSMQ 中删除 比如 接收 删除可以作为原子操作运行吗 听起来您想查看下一条消息 然后在处理完成后接收它 Message message Queue Peek Queue ReceiveById me
  • 如何查明 .exe 是否正在 C++ 中运行?

    给定进程名称 例如 程序 exe C 标准库没有这样的支持 您需要一个操作系统 API 来执行此操作 如果这是 Windows 那么您将使用 CreateToolhelp32Snapshot 然后使用 Process32First 和 Pr
  • 以下 PLINQ 代码没有改进

    我没有看到使用以下代码的处理速度有任何改进 IEnumerable
  • 从时间列表中查找最接近的时间

    所以 这是场景 我有一个带有创建时间的文件 我想从该文件的创建时间最接近或相等的时间列表中选择一个时间 完成此操作的最佳方法是什么 var closestTime listOfTimes OrderBy t gt Math Abs t fi
  • 虚拟并行端口模拟器

    在我的计算机网络课程中 我们应该通过使用本机寄存器 例如使用 outportb 等命令 来学习并行端口编程 我没有并行端口 因为我住在 2011 年 但想练习这些程序 我使用 dosbox 安装了旧的 Turboc 3 IDE 有没有一个程
  • 检测 TextBox 中的 Tab 键按下

    I am trying to detect the Tab key press in a TextBox I know that the Tab key does not trigger the KeyDown KeyUp or the K
  • 如何增加ofstream的缓冲区大小

    我想增加 C 程序的缓冲区大小 以便它不会过于频繁地写入 默认缓冲区是 8192 字节 我尝试使用 pubsetbuf 将其增加到 200K 原始代码 ofstream fq fastq1 cstr ios out fastq1 is a
  • 如何在新窗口中打开图像或pdf文件?

    我有一个 gridview 它包含文件名和文件路径 图像和 pdf 格式文件 其中我使用了模板字段 在该字段下放置了 1 个图像按钮 单击该图像按钮 即 查看 按钮 时 我想在新窗口中打开所选文件 这是我的代码 protected void
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • 在 Qt 中播放通知(频率 x)声音 - 最简单的方法?

    Qt 5 1 或更高版本 我需要播放频率为 x 的通知声音 n 毫秒 如果我能像这样组合音调那就太好了 1000Hz 持续 2 秒 然后 3000Hz 持续 1 秒 最简单的方法是使用文件 WAV MP3 例如如此处所述 如何用Qt播放声音
  • 使用 boost 异步发送和接收自定义数据包?

    我正在尝试使用 boost 异步发送和接收自定义数据包 根据我当前的实现 我有一些问题 tcpclient cpp include tcpclient h include
  • Unity,c++ 本机插件字节数组不匹配

    在我的 C 本机插件中 我有一个调用 vector

随机推荐

  • 翻译java代码软件_apk源代码翻译器

    APK源代码翻译器 安卓APK代码命令查看工具 是吾爱网友用易语言制作的安卓代码命令查看工具 该工具体积小 但功能强大 欢迎下载使用 软件说明 将apk文件拷贝至sdcard上 命令顺序如下 进入Android sdk文件夹 tools目录
  • 生成 enum 类——数字字典里新增一个按钮 生成他们对应得枚举——java

    前 后 码片 数字字典里新增一个按钮 生成他们对应得枚举 后端 xml 创建一个enum ftl Description dict dictName Author ksf Date now string yyyy MM dd Version
  • sql server 经典练习题分享二

    26 查询存在有85分以上成绩的课程Cno SELECT DISTINCT cno FROM dbo scores WHERE degree gt 85 27 查询出 计算机系 教师所教课程的成绩表 SELECT tname prof cn
  • 23. 客户默认选项(Default Customer Options)

    Editing Email Templates Email Sender Contact Us
  • iphone尺寸_2007至2020:最全的iPhone手机25部历代发展及价格变化历史

    所以iPhone SE 2020 是真的廉价倒地了 智能手机时代的开始 第一代iPhone 2G 2007 4G 3800 8G 4560 2007年 史蒂夫 乔布斯 Steve Jobs 穿着运动鞋 牛仔裤 T恤站在舞台上 宣布了第一部i
  • Maven、pom.xml

    maven库中心 Maven Central Repository Search 搜索可以用的包与版本 目录 Maven 使用方法 1 下载 配置 2 项目中使用 3 生命周期 4 构建插件 MAVEN工程 的目录结构 父子项目 创建父项目
  • dpr-2000 四usb口无线多功能打印服务器,D-Link DPR-2000 超高兼容的打印服务器

    PConline资讯 DPR 2000无线802 11 G多功能打印服务器是一个通用多端口的打印服务器 是办公 学校和商业使用的理想选择 它提供4个USB连接接口可以连接4台USB打印机 本设备给用户提供添加多个打印机 多功能打印机或扫描仪
  • vue项目使用luckyexcel插件预览excel表格

    温馨提示 需要用到luckysheet文件和luckyexcel插件 根据下面步骤一步一步操作会避免踩坑 比如我当时遇到了window luckysheet is not defined控制台报红的问题 第一步 引入luckysheet的相
  • JAVA单元测试框架-14-实现TestNG失败案例重跑

    前面是通过java代码指定重跑 本节是讲解通过实现IAnnotationTransformer接口实现失败案例重跑 创建MyRetry 实现IRetryAnalyzer 接口 package Listener import org test
  • MMsegmentation文档学习

    1 了解配置 config文件结构 config base 下有4种基本组件类型 dataset model schedule default runtime 同一文件夹下的所有配置 建议只具有一个原始配置 所有其他配置从原始配置继承 这样
  • JDK8升级JDK11最全实践干货来了

    1 前言 截至目前 2023年 Java8发布至今已有9年 2018年9月25日 Oracle发布了Java11 这是Java8之后的首个LTS版本 那么从JDK8到JDK11 到底带来了哪些特性呢 值得我们升级吗 而且升级过程会遇到哪些问
  • Ts接口的使用

    TypeScript 的核心原则之一是对值所具有的结构进行类型检查 我们使用接口 Interfaces 来定义对象的类型 接口是对象的状态 属性 和行为 方法 的抽象 描述 接口初探 需求 创建人的对象 需要对人的属性进行一定的约束 id是
  • 工作10年我面试过上百个程序员,真想对他们说…

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 一 写在前面 最近收到不少读者反馈 说自己在应聘一些中大型互联网公司的Java工程师岗位时遇到了不少困惑 这些同学说自己也做了精心准备 网上搜集了不少Java面试题
  • Edit Distance

    Given two words word1 and word2 find the minimum number of steps required to convert word1 to word2 each operation is co
  • 【转载】探索推荐引擎内部的秘密

    原网址 https www ibm com developerworks cn web 1103 zhaoct recommstudy1 index html icomments 这是2011年ibm发布的文章 较为通俗易懂 适合想入门推荐
  • 配置msf连接postgresql数据库

    BackTrack 5 R3版本的Metasploit在每次的升级后总会出现奇奇怪怪的错误 主要是Ruby的库出错 网上找了一些解决的办法 但每次更新后又会出错 蛋碎 解决方法 BackTrack 5中默认自动开启端口7337 1 查看Po
  • Zabbix监控MariaDB服务

    文章目录 1 概述监控MariaDB服务主机 2 安装MariaDB服务和配置MariaDB 3 配置Zabbix的userparameter mysql conf 文件模板 4 在Web配置模板 5 在server进行压力测试mysql服
  • svg实现文本的垂直居中对齐样式

    项目中用到表格内画折线趋势图 本人使用的svg绘制简单折线 没有数据的单元格显示文字 为了不影响表格的宽度自适应 就想到在svg上写文字 于是就有了在svg上对文字样式进行垂直居中的需求 上代码
  • Linux教程:在虚拟机中如何配置Linux系统网络环境 ?

    对于很多初学Linux 的同学 大多选择使用虚拟机来展开学习 可以方便的做实验 修改 测试 不必害怕出问题 可以随便折腾 大不了换一个虚拟机 原来的系统不受任何影响 但由于不是实体pc机 使用难免受限 如果配置不好 后期开发必受其累 比如
  • C++Primer(4-8章)

    第四章 表达式 求值顺序 C 中没有明确规定大多数运算符的求值顺序 因此我们要避免 改变了某个运算对象的值 又在表达式其他地方使用这个运算对象 这种情况出现 赋值运算满足右结合律 在输出表达式中使用条件运算符 条件运算符的优先级非常低 因此