第四章 学习总结

第四章 复合类型
复合类型是在其他类型的基础上定义的类型。
4.1指针和引用
程序中定义的变量会被分配一定的内存单元,当需要存取这个变量的值时,可以通过变量的名字访问这块内存。
4.1.1指针可以持有对象的地址,引用则是对象的别名
⑴每个指针都有相关的类型,需要在定义指针时指出。语法为:类型 指针变量;
⑵指针存放指定类型的对象的地址,要获取对象的地址,使用取地址运算符"&"。
⑶定义指针时指定的类型实际上是指针指向的对象的类型,指针不能指向不同类型的对象。
⑷指针不能保存非地址值,也不能被赋值或初始化为不同的类型的地址值。
⑸空指针的表示形式有三种,如:
int p1=nullptr;
int p2=0;
int p3=NULL;
⑹解引用只适用于确实指向某个对象的指针,不能对空指针解引用。
⑺通用指针void
指针,它可以持有任何类型的地址值。
4.1.2 new和delete
⑴new运算符
①在堆上动态分配空间,创建对象,并返回对象的地址
②一般将new返回的地址保存在指针变量中,以便间接访问堆上的对象。
⑵new表达式的三种形式
分配单个对象:new 类型 或者 new 类型(初始值)
分配多个连续存储的对象:new 类型[数组大小]
定位new,在指定位置分配空间:new (指针) 类型;
⑶new 类型[数组大小]
不能对数组进行显式的初始化
数组大小不必是常量,是数组元素的个数,不是字节数
用new分配数组时,并未得到一个数组类型的对象,而是得到一个数组元素类型的指针
⑷new运算符分配的空间用delete运算符释放
①释放new分配的单个对象的delete形式
delete 指针;
②释放new分配的数组的delete形式
delete[] 指针;
③定位new没有对应的delete表达式

①执行delete运算后,指针ip指向的空间被释放,不能再使用ip指向的内存,但是ip这个指针变量自己的存储空间不受影响
②delete后的ip不是空指针,而是“空悬指针”,即指向不确定的单元
③delete之后,继续通过ip间接使用这个单元是非法的,会引起不可预料的运行错误
⑹引用和左值引用
“引用”在C++11中被改称为“左值引用”,因为C++11新增加了“右值引用”的概念
在不引起歧义的情况下,一般仍使用“引用”来指“左值引用”。
⑺左值引用的初始化和一般变量的初始化不同
一旦初始化完成,引用将和它的初始值对象一直绑定在一起
⑻使用左值引用时注意
引用并非对象,是为已存在的对象所起的另一个名字;引用只能绑定到对象(有内存地址)上,不能与字面值或某个表达式的计算结果绑定在一起;引用本身不是对象,所以不能定义引用的引用
⑼引用的定义和初始化
引用由类型标识符和一个取地址符(&)来定义
引用必须被初始化,初始值是一个有内存地址的对象
(10)定义与判别
在赋值表达式中,出现在赋值号左边的就是左值,而在赋值号右边的则称为右值;可以取地址的、有名字的就是左值;不能取地址的、没有名字的就是右值
在C++11程序中,所有的值必属于左值、纯右值和将亡值三者之一
生成左值的表达式
返回左值引用的函数、赋值、下标、解引用和前缀自增/自减运算符
(11)定义和初始化右值引用的形式
类型 &&右值引用变量 = 右值表达式;
右值引用由类型标识符和两个取地址符(&&)定义;右值引用必须被初始化,初始值是右值表达式;不能将右值引用直接绑定到一个左值上
(12)函数std::move函数返回给定对象的右值引用
标准库中定义
调用std::move是告诉编译器希望像对待右值那样处理一个左值。所以,对一个对象调用std::move后,可以销毁它,也可以给它赋予新的值,但不能使用被移动后的对象的值。
4.1.5 const限定指针和引用
const限定词将一个对象限定为常量
⑴const限定词
关键字const限定的对象是不可改变的
⑵指向const对象的const指针
const type
const cp = initAddressValue;
4.2结构体、联合和枚举
4.2.1结构体 结构体把一组来自不同类型的数据组合在一起构成复合类型,其中的每个数据都是结构体的成员。
struct 结构体类型名{成员声明;};
4.2.2联合 联合由关键字union定义,也称共用体。
4.3 内置数组
4.3.1定义和初始化数组
类型 数组名[数组大小];
⑴数组大小是一个常量表达式,必须大于零。
⑵使用数组时一般会转换为指针。ia是一个int
类型的指针常量;ia和&ia[0]都表示数组第一个元素的地址;可以使用指针对数组进行访问。
auto和decltype与数组名
当使用数组名作为一个auto 变量的初始值时,得到的类型是指针而不是数组
decltype(数组名)返回的是数组类型:大小和元素类型
数组元素和地址
一维数组元素在内存中按下标顺序依次存放
一维数组a[n]的元素a[i]在内存中地址是a+i。
多维数组在内存中按行序存储
二维数组a[m][n]的元素a[i][j] 在内存中的地址是a+(i
n+j);使用指针访问数组时需要控制指针的范围,确保指针指向数组的元素。
✔begin()和end()
库函数begin()和end()
让指针在数组上的使用更简单更安全
在头文件中定义
用法:
begin(数组名)
返回指向数组第一个元素的指针
end(数组名)
返回指向数组最后一个元素的下一个位置的指针
4.4标准库类型string
标准库类型string表示可变长度的字符序列,字符串是对象;使用string 类要包含头文件。
例如:
#include
#include
using namespace std;
int main(){
string s1, s2; //创建两个空字符串对象
string s3 = “Hello, World!”; //创建s3,并初始化
string s4("I am ");
s2 = “Today”; //赋值
s1 = s3 + " " + s4; //字符串连接
s1 += " 5 “; //末尾追加
cout << s1 + s2 + “!” <<endl; //输出字符串内容
cout <<“Length of s1 is :” << s1.size() << endl;
//逐个输出s1中的字符
for (size_t i = 0; i < s1.size(); ++i)
cout << s1[i] <<” ";
}
◎读写标准库中iostream可以读写string对象。
◎getline()函数
两个参数:输入流对象和存放读入字符串的string对象
从指定输入流中读取内容,遇到换行符为止;将所读内容存入指定的string对象中,流中的换行符被读取并丢弃。
◎empty()函数判断string对象是否为空,返回一个布尔值
stringObj.empty()
◎size()函数返回string对象的长度,即对象中字符的个数
返回的长度是string::size_type类型
◎可以用关系运算符比较两个字符串对象
两个string相等意味着它们的长度相同,并且所包含的字符也完全相同
字符串的大小关系依照字典顺序定义且区分大小写字母
◎用下标运算符可以访问string对象中指定位置的字符
string对象s的下标范围从0到s.size()-1
下标变量的类型是string::size_type
4.5标准库类型vector
vector的特点
表示对象的集合,其中所有对象的类型都相同,可以通过索引访问各个对象
vector是对象,其中容纳着其他对象,被称为容器
vector的用法
vector是长度可变的向量,可替代内置数组
更灵活,更高效
要使用vector,必须包含头文件

猜你喜欢

转载自blog.csdn.net/qq_43627355/article/details/88784262