一、复合类型
1、指针
指针:指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内可以先后指向几个不同的对象。
指针无需在定义时赋初值。
int a = 42;
int *p = &a; //p存放变量a的地址,或者说p指向变量a的指针 指针的值(地址)应属于下列四种状态之一:
1:指向一个对象。
2:指向紧邻对象所占空间的下一个位置。
3:空指针,意味着没有指向任何对象。
4:无效指针。
所有指针的类型都要和它所指的对象严格匹配。
注意:
void*指针是一种特殊的指针类型,可用于存放任意对象(不分类型)的地址。但是作用有局限。
1:用作与别的指针比较。
2:作为函数的输入输出。
3:用作赋值给另外一个void*的指针。
不能直接操作void*指针所指的对象。因为并不知道这个对象是什么类型。
指针不能保存非地址值,也不能被赋值或初始化为不同类型的地址值。
解引用(*):
如果指针指向一个对象,则可以通过指针间接访问该对象。例如:int x=100;int y=20;int *pi=&x;*pi=y;//间接操作pi指向X,x=y;解引用只适用于确实指向某个对象的指针,不能对空指针解引用。
2、 New。
系统为所有程序提供了一个运行时可用的内存池,这个内存池称为自由存储区或堆。 堆:数据空间,系统静态分配。
堆占:动态分配空间,系统申请占内存较小。
New:在堆上动态分配空间,创建对象,并返回对象的地址,返回的地址保存在指针变量 中,间接访问堆上对象【new 类型(初始值)】。
分配指定类型和大小的数组,分配多个连续存储的对象【new 类型[数组大小]】。
定位new,将对象创建在已经分配好的内存中,必须包含头文件<new>,【new (指针)类型】
例如:int* ip2 =new int(100);// int* ip2 =new int[100]。
3、 delect。
new运算符分配的空间用delect释放。【delect 指针;或delect [ ]指针】
执行后,指针指向的空间被释放,不能再使用该指针内存,但是delect后的指针不是空指针,是空悬指针(指向不确定的单元)
4、引用
引用:用来为对象起另外一个名字,引用类型引用另外一种类型。
定义引用时,程序会把引用以及它的初始值绑定在一起,而不是你将初始值拷贝给引用。
无法将引用重新绑定到另外一个对象,因此引用定义时必须要初始化。
int i = 1024;
int &a = i; //定义一个引用,a指向i
int &b; //错误,引用未被初始化
引用本身不是一个对象,所以不能定义引用的引用。
int &c = a; //错误
引用只能绑定在对象上,而不能与字面值或某个表达式的结果绑定在一起。
int &d = 10; //错误
为引用赋值:把值赋给了与引用绑定的对象。
获取引用的值:获取了与引用绑定对象的值。
5、 const限定指针和引用
const只读属性,只使用不修改,限定常量。
指向常量的指针;指向非const对象的指针常量;指向const对象的const指针;const限定引用。
6、结构体
结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。
Struct 结构体类型名{成员声明;};
结构体的成员不能独立使用,必须由结构体类型的变量通过成员选择运算符“.”选择或者由结构体类型的指针通过“->”选择
7、枚举
枚举是一种包含固定常量的数据类型。
在限定作用域的枚举中,枚举成员的名字遵循常规的作用域准则,在作用域外是不可访问的。
在不限定作用域的枚举类型中枚举成员的作用域与枚举类型本身的作用域相同。
C++中枚举注意事项:
枚举提高了类型安全性
枚举可以很容易地在switch语句块中使用
枚举可以遍历
枚举可以有字段,构造函数和方法
枚举可以实现许多接口,但不能扩展任何类,因为它在内部扩展Enum类。
8、内置数组。
类型 数组名[数组大小];
一个数组不能被另一个数组初始化,也不能直接赋值给另一个数组。
访问数组元素:使用数组下标时,通常定义为size-t类型。在<cstddef>头文件中定义,表示内存中任意对象的大小。
数组与指针:使用数组的时候编译器一般会把它转换为指针。当使用数组作为一个outo变量的出始值时,得到的类型是指针而不是数组。
二维数组a[m][n]的元素a[i][j]在内存中的地址是a+(i*n+j)。
Begin(数组名);
End(数组名);取最后一个元素的下一个位置(第一个无效元素位置)。
9、标准库类型 string(表示可变长度的字符序列)
头文件<string>Getline()
标准库string对象的读写:
1)读取忽略开头所有的空白字符(空格,换行符,制表符)。
2)读取字符直到再次遇到空白字符。
10、标准库类型vector
【头文件<vector>】
Vector<元素类型>变量名;
Push_back()添加元素;pop_back()删除末尾的元素。
使用下表运算符可以获得vector中指定位置 的元素。下标类型:vector<T>::size_type
二、函数
1、 函数定义:返回类型 函数名(参数列表) {函数体}
2、函数的形式
(1)无参函数
无参数传递的函数,不需要带回函数值
(2)有参函数
有参数传递,需要带回函数值
(3)空函数
函数体只有一对花括号,花括号内没有任何语句
3、.函数的调用
声明了函数原型之后,便可以按如下形式调用函数:
函数名(实参列表);
实参列表中应给出与函数原型形参个数相同、类型相符的实参
4、 参数传递(传值和引用)。
按值传递:简单直接,不会改变实参内容。默认情况下,函数的返回值是按值传递的,得到控制权的主调函数将接收return语句中指定的表达式副本。
引用传递:避免复制,但仍然可以访问实参对象。
传地址不安全,若指针指向重要数据区会造成大问题,传引用更好。
5、函数的返回值
在组成函数体的各类语句中,值得注意的是返回语句return。它的一般形式是:
return(表达式);
其功能是把程序流程从被调函数转向主调函数并把表达式的值带回主调函数,实现函数的返回
6、返回指针或引用时,绑定内容必须是存在的,不返回局部变量。
7、 静态局部变量:作用空间不大,生存周期很长,离开函数空间不起作用。寄存器变量:数量有限,速度特别快(直接操作),无内存地址,取地址取不出来。
8、重载函数
如果同一个作用域内的几个函数名字相同但形参列表不同,则为重载函数(名字相同,功能类似,参数不一样)