第4章 复合类型

1. 如果将sizeof运算符用于数组名,得到的将是整个数组中的字节数。

2. 如果对数组的一部分进行初始化,则编译器把其他元素设置为0。因此,将数组中的所有元素初始化为0,只要显式地将第一个元素初始化为0。

如long totals[500] = {0};

C++的大括号初始化(列表初始化)方式可以用于所有的类型。数组以前就可以使用列表初始化,但C++11中的列表初始化新增加了一些功能。

首先,初始化数组时,可省略等号。

其次,可不在大括号内包含任何东西,这将把所有元素初始化为0。

int earnings[4] {1, 2, 3, 4};

int earnings1[4] {};

3. cin.getline()和cin.get()这两个函数都读取一行输入,直到到达换行符。区别是cin.getline从输入流中取出换行符后丢弃换行符,而get()将换行符保留在输入流中。getline函数有两个参数,第一个参数是数组名称,第二个参数是要读取的字符数。

cin.getline(name, 20);

cin.get有多个变体,可以用cin.get(name, 20).get()来达到getline的效果,否则继续使用cin.get(address,20)无法读取字符,因为换行符还在输入流中。

为什么使用get(),而不是getline()?get()能够判断停止读取的原因是读取了整行,还是已经读取了指定的字符数,通过判断下一个字符是否为换行符可知。

4. 当get()读取空行时,会设置失效位(failbit),并关闭后面的输入。如果输入行的字符数比指定的多,则getline()和get()将把余下的字符留在输入队列中,而getline()还会设置失效位,并关闭后面的输入。

可以用cin.clear()来恢复输入。

5. 当cin读取年份时,将回车键生成的换行符留在了输入队列中。后面的cin.getline()看到换行符,以为是一个空行,会将一个空字符串赋给address数组。

int year;

char address[80];

cout << "input year: ";

(cin >> year).get();

cout << endl << "input address: ";

cin.getline(address, 80);

6. 除了使用字符串常量直接初始化C-风格字符串和string对象外,C++11允许使用列表初始化。

char date1[] = { "Le Chapon Dodu" };

char date2[] {"The Elegant Plate"};

string date3 = { "The Bread Bowl" };

string date4{ "Hank's Fine Eats" };

7. 获取一行输入:P86

char charr[20];

string str;

cin.getline(charr, 20);//istream的类方法

getline(cin, str);//不是istream的类方法

在引入string类对象之前,C++就有了istream类,所有istream类中,有处理double、int和其他基本数据类型的方法,当没有处理string对象的方法。

那么为什么cin >> str;可以工作呢?

因为这是使用了string类的友元函数。

而int x; cin >> x;使用了istream的一个成员函数。

8. P87原始(raw)字符串R”()”。

cout << R"("King\n")"; 将输出”King\n”。

9. P94结构体中的位字段。(硬件编程)

10. 联合体的长度为其最大成员的长度。

11. 枚举量是整型,可被提升为int类型,但int类型不能自动转换为枚举类型。如果int值是有效的,则可以通过强制类型转换,将它赋予枚举变量。

12. 可以创建多个值相同的枚举量。

enum {zero, null = 0, one, numero_uno = 1};

zero和null的值为0,one和numero_uno的值为1。

13. 枚举的取值范围,见P97下限和上限的求法。

每个枚举都有取值范围,通过强制类型转换,可以将取值范围中的任何整数值赋给枚举变量,即使这个值不是枚举值。

14. 选择用多少空间来存储枚举由编译器决定。对于取值范围较小的枚举,使用一个字节或更少的空间;对于包含long类型值的枚举,则使用4个字节。

15. 指针不是整形(虽然计算机通常把地址当作整数来处理)。要通过强制类型转换才能将数据赋给指针。

int * pt;

pt = (int *) 0xB8000000;

16. 对空指针使用delete是安全的。不能用sizeof运算符来确定动态分配的数组包含的字节数。

17. C++将数组名解释为指向数组第一个元素的地址。

18. 在很多情况下,可以以相同的方式使用指针名和数组名。主要的区别如下:

首先,指针是变量,而数组名是常量;

其次,用sizeof运算符得到的结果不同。对数组使用sizeof得到的是数组的长度,而对指针应用sizeof得到的是指针的长度。

19. 数组名被解释为第一个元素的地址,而对数组名应用地址运算符时,得到的是整个数组的地址。

short tell[10];

cout << tell << endl;

cout << &tell << endl;

从数字上说,虽然两个地址相同;但从概念上讲,tell是一个2字节的内存块的地址,而&tell是一个20字节内存块的地址。因此tell + 1将地址值加2,而表达式&tell + 1将地址值加20。换句话说,tell是一个short指针(*short),而&tell是一个这样的指针,指向包含20个元素的short数组(short (*)[20])

20. 当指针指向同一个数组中的元素时,对两个指针做差才有意义,这样得到两个元素的下标间隔。

21. 给cout提供一个字符的地址,则它将从该字符开始打印,直到遇到空字符为止。(包括char数组名,char指针以及用括号括起的字符串常量)

22. 一般来说,如果给cout提供一个指针,它将打印地址。但如果指针的类型为char *,则cout将打印字符串。如果要显示的是字符串的地址,则必须将这种指针强制转换为另一种指针,如int *。

23. C++有三种内存管理方式,自动存储、静态存储和动态存储(C++11新增加了第四种类型——线程存储)。

函数内部定义的常规变量为自动变量,存储在栈中。

静态存储是整个程序执行期间都存在的存储方式。使变量成为静态的方式有两种:一种是在函数外面定义它;另一种是在声明时使用关键字static。动态存储是使用new、malloc分配的内存,存储在堆中。

24. 数组、vector和array

下面的声明创建一个名为vt的vector对象,它可存储n_elem个类型为typeName的元素:vector<typeName> vt(n_elem);

vector类的功能比数组强大,但效率稍低。C++11新增加了模板类array,与数组一样,array的长度也是固定的,也使用栈,而不是堆),因此其效率和数组一样,但更方便,更安全。

array<typeName, n_elem> arr;

与创建vector对象不同的是,n_elem不能是变量。

25. array对象和数组存储在相同的内存区域(即栈)中,而vector对象存储在堆中。可以将一个array对象赋值给另一个array对象,而对于数组,必须逐元素复制数据。

26. vector和array对象的中括号表示法和成员函数at()的差别在于,使用at()时,将在运行期间捕获非法索引,而程序默认将中断。

C++ primer plus读书笔记——第4章 复合类型的更多相关文章

  1. C++ Primer Plus读书笔记(三)复合类型

    这节主要是介绍数组.结构体.类等概念,以及new delete内存管理. 1.数组 首先普及一下C++中字符串的概念,只有在结尾有 \0 的才叫字符串, cout 输出字符串也以空字符为标记进行结束输 ...

  2. C primer plus 读书笔记第十一章

    本章标题是字符串和字符串函数.主要是了解和字符串有关的函数. 1.字符串表示和字符串I/O 主要内容:字符串常量和字符串数组的初始化,对比了指针和字符串. 其中要注意的是,数组初始化是从静态存储区把一 ...

  3. C primer plus 读书笔记第六章和第七章

    这两章的标题是C控制语句:循环以及C控制语句:分支和跳转.之所以一起讲,是因为这两章内容都是讲控制语句. 第六章的第一段示例代码 /* summing.c --对用户输入的整数求和 */ #inclu ...

  4. C primer plus 读书笔记第五章

    本章的标题是运算符,表达式和语句.主要研究如何处理数据. 示例代码展示了一个使用简单的while循环的代码,难度不大. 下面简单介绍本章的基本概念. 1.基本运算符. 基本运算符有:赋值运算符(C语言 ...

  5. C primer plus 读书笔记第四章

    本章的标题是字符串的格式化输入/输出,重点介绍输入和输出. 本章的第一段示例代码和上一张示例代码很相近,代码就不贴了,新出现的特性是使用了一个数组来存放字符串,C预处理命令和strlen()函数. 下 ...

  6. C primer plus 读书笔记第三章

    本章的标题是数据和C,主要内容是介绍数据类型中的整数类型和浮点数类型. 本章的第一段代码 #include <stdio.h> int main(void) { float weight; ...

  7. C++ primer plus读书笔记——第17章 输入、输出和文件

    第17章 输入.输出和文件 1. 对键盘进行输入缓冲可以让用户在将输入传输给程序之前返回并更正.C++程序通常在用户按下回车键时刷新输入缓冲区. 2. 一些I/O类 streambuf类为缓冲区提供了 ...

  8. C++ primer plus读书笔记——第16章 string类和标准模板库

    第16章 string类和标准模板库 1. string容易被忽略的构造函数: string(size_type n, char c)长度为n,每个字母都为c string(const string ...

  9. C++ primer plus读书笔记——第15章 友元、异常和其他

    第15章 友元.异常和其他 1. 友元类的所有方法都可以访问原有类的私有成员和保护成员.另外,也可以做更严格的限制,只将特定的成员函数指定为另一个类的友元.哪些函数.成员函数.或类为友元是由类定义的, ...

随机推荐

  1. C语言函数调用完整过程

    C语言函数调用详细过程 函数调用是步骤如下: 按照调用约定传参 调用约定是调用方(Caller)和被调方(Callee)之间按相关标准 对函数的某些行为做出是商议,其中包括下面内容: 传参顺序:是从左 ...

  2. Net Core 重要的技术点

    Net Core 重要的技术点 1.中间件概念 Asp.Net Core作为控制台应用程序启动,在Program的Main方法是入口,通过调用CreateWebHostBuilder创建WebHost ...

  3. 从I/O多路复用到Netty,还要跨过Java NIO包

    本文是Netty系列第4篇 上一篇文章我们深入了解了I/O多路复用的三种实现形式,select/poll/epoll. 那Netty是使用哪种实现的I/O多路复用呢?这个问题,得从Java NIO包说 ...

  4. (十四--十五)数据库查询优化Part I

    (十四--十五)数据库查询优化Part I 如果理解的有问题.欢迎大家指出.这也是我在看课记得笔记..可能会有很多问题 查询优化的重要性 请记住用户只会告诉DMBS他们想要什么样的结果,而不会告诉他们 ...

  5. Java中的集合List - 入门篇

    前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的集合List - 入门篇>,希望对大家有帮助,谢谢 简介 说实话,Java中的集合有很多种,但是这里作为入门级别,先简单介绍第一种 ...

  6. java例题_03 水仙花数

    1 /*3 [程序 3 水仙花数] 2 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身. 3 例如:153 是一个 ...

  7. [模拟]P1047 校门外的树

    校门外的树 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,- ...

  8. [Fundamental of Power Electronics]-PART I-4.开关实现-4.1 开关应用

    4.1 开关应用 4.1.1 单象限开关 理想的SPST(Single pole single throw)开关如图4.1所示.开关包含电源端子1和0,其电流和电压极性如图所示.在接通状态下,电压\( ...

  9. 梳理一下最近准备蓝桥杯时学习DP问题的想法

    学习时间不长,记录的只是学习过程的思路和想法,不能保证正确,代码可以在acwing上AC. 01背包问题: 1.首先是简单的01背包问题 2.先确定状态,f[i][j]表示有第i件物品,时间为j的最大 ...

  10. Leedcode算法专题训练(排序)

    排序 快速排序 用于求解 Kth Element 问题,也就是第 K 个元素的问题. 可以使用快速排序的 partition() 进行实现.需要先打乱数组,否则最坏情况下时间复杂度为 O(N2). 堆 ...