C++ Primer 知识点总结

从p54开始
2019年12月16日学习

相关资料请见原贴。
https://www.nowcoder.com/discuss/328508?type=2&order=0&pos=6&page=3
这篇博文是C++primer的学习笔记,主要是自我督促。后续将会补充计算机其余课程的知识点总结。同时感谢前人的无私奉献。
(未完待续)

第二章 类型
2.4 const
若想在多个文件文件共享const,需要在定义位置加上extern
修饰的变量的值不能改变。(顶层const)

2.4.1const引用
意义是不能通过引用改变对象的值。(底层const)
(1)被引用的对象为const,定义引用前必须加上const。因为对象是const不能改变,所以引用也得是const。
(2)但是对象不是const,引用也可以是const,意思是不能通过引用改变对象的值,但是对象的值可以通过其他方式改变。

2.4.2const指针
指针本身是不是常量 和 指针所指向的对象是不是常量(能不能通过指针改变对象的值),这是两个独立的概念。

在*前面加const(底层const)
意义是不能通过指针改变对象的值。
(1)被指针的对象为const,定义指针前必须加上const。因为对象是const不能改变,所以指针也得是const。
(2)但是对象不是const,指针也可以是const,意思是不能通过指针改变对象的值,但是对象的值可以通过其他方式改变。

在*后面加const(顶层const)
这个指针保存的地址不能改变。
(3)和引用不一样的是,指针本身是对象,引用是别名。

举例:
curErr的const在*后面,这个指针存放的内存地址不能改变,始终指向相同的位置。但是可以用curErr改变对象的值。(顶层const)
pip 第一个const,意思是不能通过pip改变对象的值(底层const);第二个const,意思是始终指向这个对象,不能改变地址(顶层const)。

2.4.3顶层const
顶层const:本身是个常量,例如 指针,变量。
底层const:不能通过它改变指向对象的值,例如 引用 和 指针。
指针既可以是顶层也可以是底层const。
(1)常量拷贝时,顶层const可以直接用来初始化别的变量。

(2)底层const拷贝,拷入和拷出必须有相同的底层const资格。

p没有限定一定要指向常量,但是p3是底层const,限定了必须指向常量,所以错误。

总而言之,就是对于底层const,不能把底层const赋值给一个一般的变量(他没有这个const的权限),但是可以把一个一般的变量赋值给底层const(相当于2.4.1(2)的功能)。

2.4.4 常量表达式和constexpr
常量表达式:1⃣️值不会改变2⃣️编译过程就能得到结果的表达式。例:字面值。它由数据类型(顶层const)和初始值(确定的值)共同确定。

constexpr:如果你认定一个一个变量是常量表达式,就声明为constexpr,由计算机判断。

对于指针而言,constexpr仅对指针有效,而对指针指向的对象无关(顶层const)。

2.5处理类型
2.5.1typedef的两种方式
(1)typedef

容易出现的错误理解

Typedef后,容易错误理解为底层const,实际上是一个顶层const。
(2)别名声明

2.5.2 auto
用auto声明的变量必须有初始值。
同一行可以定义多个变量,但是必须属于同一个基本数据类型。
auto会忽略顶层const(如果是,需要在auto前面加一个const),能保留底层const。

2.5.3 decltype

注意的是,如果定义一个引用,必须初始化。

3 array vector string
3.5 array
3.5.1 内置数组的定义和初始化
(1)维度必须是一个常量表达式。
(2)定义时必须指定数组类型,不能用auto由初始值列表来推断。
(3)数组的元素必须是对象,所以元素不能是引用。
(4)声明数组时没有指明维度,编译器可以根据初始值数量进行推断;如果指明了维度,初始值总数不能超过该维度,且剩下的元素会被初始化为默认值。
(5)当使用 字符串字面值 初始化 字符数组 时,结尾会有一个额外的空字符。

(6)不能用别的数组给一个数组进行初始化,也不能用数组对数组赋值。

2019年12月17日学习
3.5.2 访问数组元素
(1)数组下标是 size_t 类型,它是一个足够大的机器相关的无符号数。
(2)用规范的for语句遍历数组,string,和vector,防止越界。

3.5.3 指针和数组
(1)编译器会把数组转为指针,对数组元素取地址就能得到它的指针。

(2)数组的指针支持类似vector和string迭代器的运算。
(3)begin(), end(),取数组第一个元素和最后一个元素的后一个元素。注:array不是类,所以这两个函数不是成员函数。

3.5.5 C++与C的接口
(1)混用string对象和C风格字符串

(2)用数组初始化vector对象
不允许用数组和vector对象初始化一个内置类型的数组,但是可以用数组初始化vector对象。

注意,end(int_arr)指的是数组尾元素的下一个位置。

(3)尽量使用 vector,迭代器和string,避免使用 内置数组,指针和C风格基于数组的字符串。

发布了29 篇原创文章 · 获赞 19 · 访问量 4460

猜你喜欢

转载自blog.csdn.net/iwanderu/article/details/103578197