重读C++ PRIMER——第三章笔记

目录

1、头文件不应包含using声明,以避免名字冲突。

2、getline会读取换行符,但不会将它存入string参数中,返回值是它的流参数。

3、vector能容纳绝大多数类型的对象作为其元素,但因为引用不是对象,所以不存在包含引用的vector。

4、声明vector的老式语法

5、对vector进行列表初始化

6、不能使用范围for语句向vector中添加元素

7、范围for循环

8、数组的初始化

9、数组的类型

10、数组的下标可以为负数,但得到的指针必须指与原指针向同一个数组。

11、不允许用一个数组的内容赋值或初始化另外一个数组。

12、默认初始化(66页)和值初始化(114页)


1、头文件不应包含using声明,以避免名字冲突。

2、getline会读取换行符,但不会将它存入string参数中,返回值是它的流参数。

3、vector能容纳绝大多数类型的对象作为其元素,但因为引用不是对象,所以不存在包含引用的vector。

 

4、声明vector的老式语法

 

5、对vector进行列表初始化

当使用列表初始化语法初始化vector时,如果使用了花括号的形式,但提供的值又无法进行列表初始化,编译器会尝试用默认值初始化

这里,“值初始化”的含义是在容器比如vector或数组没有提供初值而只提供了元素数量,库会提供一个值初始化了的元素初值,把它赋给容器中的所有元素。(114页最下)值初始化的理解:编译器提供一个初始值去初始化某个或某些对象。

6、不能使用范围for语句向vector中添加元素

这是因为范围for语句来源于与之等价的普通for语句

因为在初始语句的部分预存了end()的值,在序列中添加或删除值,end()值就无效了。(195页)

7、范围for循环

如果想要改变遍历对象的值,就要把循环变量声明成引用类型

8、数组的初始化

默认情况下,数组的元素被默认初始化。

数组这一复合类型的默认初始化规则和简单类型一样。对全局变量,这意味着有确定的初始值,对函数内(或者说是块内)的局部变量来说意味着值不确定。

数组的类型必须指定,因此定义数组不允许使用auto,且数组元素必须是对象(即不存在引用数组,这点和vector一样)。

使用列表初始化对数组进行显示初始化时,没有对应列表初值的数组元素被默认初始化。

9、数组的类型

数组元素的个数也是数组类型的一部分。用到数组名字的地方,编译器会把这个名字转换为指向首元素的指针。

当使用数组(名字)作为auto变量的初始值时,得到的是一个指针类型而非数组

但是对decltype来说,这种转换不会发生,得到的类型是数组类型

注意: 为了避免使用auto变量时数组(名字)被转换为指针,必须声明其为引用类型

如果不声明成引用,则row的类型将是一个指针,那么内层循环将会报错

上面的循环会遍历ia的所有元素,这些元素都是数组,用这些元素初始化row时,row成为了指向首元素的指针,这样row的类型是int*。

所以使用范围for循环处理多维数组时除了最内层循环外,循环控制变量都要声明成引用类型。

上述两种范围for的情况都是将序列对象的元素值依次赋值给auto变量,对多维数组来说就是把一个内层数组对象赋值给这个循环变量,这个数组对象会被转换成其首元素的地址,即int*。

但是直接将多维数组的名字(代表数组对象)用等号操作符赋值给一个循环变量就不同了,因为数组名字会被转换成数组首元素的指针,如果这个首元素是一个数组的话(多维数组就是数组的数组),这个指针就是指向数组的指针了

上图中p的类型是int (*)[4]而不是像范围for那样类型是int*,对p解引用得到一个数组对象,转换成首元素地址后赋值给q,所以q的类型是int*。

同理,当把多维数组作为实参传递给函数时也会发生上述的过程:真正传递的是指向数组首元素的指针,因为处理的是数组的数组,所以首元素就是一个数组,那么这个指针就是一个指向数组的指针。数组第二维(以及后面所有的纬度)的大小都是数组类型的一部分,不能省略(221页)。

10、数组的下标可以为负数,但得到的指针必须指与原指针向同一个数组。

11、不允许用一个数组的内容赋值或初始化另外一个数组。

因此,函数调用时不能以值传递的方式使用数组参数,但形式上是可以这么写的,只是数组被转换成指向数组首元素的指针。(219页)了参见本笔记第9条。

12、默认初始化(66页)和值初始化(114页)

默认初始化规定了一个对象或变量没有被显式初始化时这个变量获得具体值的规则(总共有三天):静态或全局内置类型会被初始化为0,而局部变量被初始化为随机值;自定义类类型由其构造函数决定。

值初始化强调的是对一个变量,没有显示的提供初值,编译器会为其构造一个初值将其初始化。初始化的效果是默认初始化的子集,只有两种情况:内置类型被初始化为0,自定义类型使用类型的默认构造函数。

值初始化对vector对象是很常见的,此外还有在动态分配对象时(434页)

注意值初始化就是在类型名(包括内置类型)后跟一对空的圆括号。

默认初始化和值初始化之间差了一对圆括号

对定义了默认构造函数的类型来说,这两种初始化没有什么区别,而对于内置类型,区别就大了,值初始化的对象有着良好定义的值。

列表初始化和值初始化往往会同时发生,提供的初始化器数目小于元素数目,剩余元素将进行值初始化。(114页、128页、450页)​​​​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值