C++ Primer Plus 读书笔记(第4、5章)

第四章 复合类型

影响最深的复合类型是类,它是将学习的OOP的堡垒。复合类型必将是用来处理更加复杂的数据类型。

 

C++没有数组越界的检测

越界的代码可能能够正确运行和结束,但是也可能因为越界整个程序乃至操作系统崩溃。C++的数组其实和指针有着紧密的联系,和使用指针访问可能就是一个形式上的不同,本质上没有任何区别。也即a[7]*(a+7)在编译器看来是等价的。

 

字符串常量

C++中能够定义字符串常量,但是如果一个字符指针是使用字符串指针来初始化的,那么这个指针是不能够用来改变这个常量的。且如果定义了两个相同的常量那么不同的系统可能采用不同的策略来决定是只保留一份还是多份。

 

几个函数

getline()接受一行,并丢弃换行,get()接受一行但是不丢弃回车,并将回车留在输入缓冲区内,如果一直使用get()来读取一行的话,将没有将这个回车处理掉,需要使用一个get()的一个重载函数来读掉最后的一个回车。

 

匿名结构体/共用体

所谓匿名就是在定义一个结构体或者是共用体的时候不给定这个类型的名字,而是一次性使用。在定义一个结构体的时候,可以将一个匿名共用体直接当做一个结构体的成员变量,而不需要在结构体外先声明这个共用体。

 

指针与变量

变量是将值视为给定的量,而将地址视为派生量,指针将地址视为给定的量,而将值视为派生量。个人更喜欢吧“*”称作解除引用运算符。

一定要在对指针应用解除引用(*)之前,将指针初始化为一个确定的、适当的地址。

 

指针的算术运算

指针的算术运算上加1是加上基本类型所占用内存大小个单元。int a[5]其中a的基本类型是int *,因此a+1地址加4,而&a 的基本类型是int (*)[5]&a+1地址加20

 

C++的内存管理方法

C++有三种管理数据内存的方式:自动存储、静态存储和动态存储。

自动存储:

在函数内部定义的常规变量使用自动存储空间,被称为自动变量,随着函数的调用出现,随着函数的消失而消亡。是一种栈的存储结构。

 

静态存储:

一个变量要成为静态变量的方式有两种:一种是在函数外面定义了它,而另外一种是在声明变量时使用关键字static

 

动态存储:

Newdelete运算符提供了一种比自动变量和静态变量更灵活的方法。他们管理了一个内存池,这个在C++中被称为自由存储空间或堆。

 

数组的替代品:

vector以及array能够用来替代数组,并且用过.at()的成员变量来检测数组是否越界。

 

 

 

 

第五章 循环和关系表达式

自增/自减运算符&副作用和顺序点:

副作用是指在计算表达式时对某些东西(如存储在变量中的值)进行了修改。C++中语句中的分号就是一个顺序点,一个完整的表达式的末尾也是一个顺序点。一个完成的表示式是指一个表达式不是另外一个更大的表达式的子表达式。C++只能够确保当到达一个顺序点时,赋值运算符、递增、递减运算符执行的所有修改都要完成。

y = (4 + x++) + (6 + x++);

表达式4 + x++不是一个完整的表达式,因此C++不保证x的值在计算子表达式4 + x++后立即增加1。在这个例子中,整个赋值语句是一个完整表达式,而分号标示了顺序点,因此C++只保证程序执行到下一条语句之前,x的值将被递增两次。C++没有规定是在计算每个子表达式之后将x值递增,还是整个表达式计算完毕后才将x的值递增,有鉴于此,我们应该避免使用这样的表达式。

对于系统变量而言在没有使用一个变量时,借助于智能的编译器自增自减效果一样。但是我们在使用自己的类时,前缀运算符要更好,因为后者要开辟一个临时的空间。

 

循环的边界

对于循环的边界一定要处理好,尤其在一些“好”的循环下(到达边界后还是没有因为非法而退出),因此一些硬性的规定或者是哨兵位是我们要选择的。

 

for,while ,do...while

for循环主要用来处理那些已知次数的循环,而后两者用来处理循环次数未知的循环。前两者又称为入口条件循环,后者又称为出口条件循环。

 

类型别名:

C++有两种定义类型别名的方式:#define 和 typedef,推荐后者是因为在以下的情况下define会有一定的问题。

#define int* pword

pword p1, p2;

我们的本意可能是要定义两个指向int类型的指针,但是p2确实一个int型。typedef就能够避免这样的问题。

 

数组的遍历:

C++11增加了两种对数组的遍历。

int a[5] = {1, 2, 3, 4, 5};

for (int x : a) {...} 这样就能够通过x来访问各个元素,如果要更改各个元素的话

for (int &x : a) {...} 采用左边的引用格式。 

 

原文地址:https://www.cnblogs.com/Lyush/p/2915452.html