复合类型是基于整形和浮点型创建的。影响最为深远的复合类型是类。
1、数组
数组是一种数据格式,能够存储多个同类型的值。
typeName arrayName[arraySize] int months[12] = {1, 2, 3};其他元素将设置为0 char name[4] = {'p', 'i', 'g', '\0'};
不能将一个数组赋值给另一个数组。
2、字符串
存储在内存的连续字节中的一系列字符。C++处理字符串的方式有两种。一种来自C语言,常被称为C-风格字符串,另一种基于string类库的方法。
C-风格字符串:
以空字符 \0 结尾,其ASCII为0,用来标记字符串的结尾。
char name[4] = {'p', 'i', 'g', '!'};//不是字符串 char name[4] = {'p', 'i', 'g', '\0'};//是字符串
用引号括起的字符串称为字符串常量或字符串字面值,隐式包含结尾的空字符,如:
char bird[11] = "Mr. Cheeps"; char fish[] = "Bubbles"; strlen不计算空字符,strlen(bird) == 10 strcpy(charr1, charr2);//copy charr2 to charr1 strcat(charr1, charr2);//append contents of charr2 to charr1 strncpy(food, "a picnic basket filled with many goodies", 19); food[10] = '\0';
cin如何确定已完成字符串的输入?
由于不能通过键盘输入空字符,因此cin需要用别的发那个发来确定字符串的结尾位置。cin使用空白、制表符和换行符来确定字符串的结束位置。
读取一行:cin.getline()和cin.get()。
这两个函数否读取一行输入,直到达到换行符。不同的是,cin.getline()将丢弃换行符,get将保留换行符在输入序列中。
cin.getline(fish, 20);
cin.get()读取下一个字符
string类
可以使用C-风格字符串来初始化string对象,如string str2 = "test";
可以使用cin、cout来输入或输出string对象
可以使用数组表示法来访问存储在string对象中的字符
可以将一个string对象赋值给另一个string对象,string类与C-风格字符串
#include <iostream> #include <string> using namespace std; void main() { char char1[20]; char char2[20] = "c string"; string str1; string str2 = "string"; str1 = str2; strcpy(char1, char2); str1 += " !"; strcat(char1, " !"); int len1 = strlen(char1); int len2 = str1.size(); cout << char1 << endl << str1 << endl; } string类读取一行 getline(cin, str); 3、结构和结构数组 struct sname { int id; char name[20]; }; void main() { sname s[1]; s[0].id = 1; strcpy(s[0].name, "pig"); cout << s[0].id << ":" << s[0].name << endl; }
4、共用体
共用体能存储不同的数据类型,但只能同时存储其中的一种类型。
5、枚举
enum 枚举名{
标识符[=整型常数],
标识符[=整型常数],
...
标识符[=整型常数],
} 枚举变量;
enum spectrum{red = 1, orange, yellow, green, blue};
只能将整型赋值给枚举。
6、指针 - 变量的地址
OOP强调的是在运行阶段(而不是编译阶段)进行决策。
指针:用于存储值的地址。*运算符被成为间接值或解除引用运算符,将其应用与指针,可以得到该地址处存储的值。
int * id;
char *pc = new char;
通常情况下,地址需要2个还是4个字节取决于计算机系统。
一定要在对指针应用解除引用运算符之前,将指针初始化一个确定的、适当的地址。
C语言可通过malloc来分配内存;在C++中仍然可以这样做,但C++还有更好的方法 - new运算符。
为一个数据对象(可以是结构,也可以是基本类型)获得并指定分配内存的通用格式如下:
typeName * pointer_name = new typeName;
new分配的内存块通常与常规变量声明分配的内存块不同。常规变量存储在栈中,而new存储在堆或自由存储区的内存区域中。
使用new分配的内存需要使用delete来释放,一定要配对使用new和delete,否则将发生内存泄漏,也就是说,被分配的内存再也无法使用了。如果使用new时带方括号,则delete也应带上,如果没带,则不用带。
new和delte遵守规则
不要使用delete来释放不是new分配的内存
不要使用delete释放同一个内存卡两次
如果使用new [] 为数组分配内存,则应使用delete []来释放
如果使用new为一个实体分配内存,则应使用delete来释放
对空指针应用delete是安全的。
在编译时给数组分配内存称为静态联编,在运行时动态分配称为动态联编。
使用new创建动态数组
为数组分配内存的通过格式
typeName * pointer_name = new typeName[num_elements]; int * psome = new int[10]; delete [] psome;
使用动态数组
指针指向内存块中的第一个元素,所以*psome是第一个元素的值。也可使用数组的方式来访问,如psome[2]
数组与指针基本等价是C和C++的优点之一
C++将数组名解释为地址
指针变量加1后,增加的量等于它指向的类型的字节数。
对数组使用sizeof运算符得到的是数组的长度,而指针使用sizeof得到的是指针的长度,即使指针指向的是一个数组。
数组名被解释为第一个元素的地址,对数组名应用地址符时,得到的是整个数组的地址。
short tell[10]; cout << tell << endl; cout << &tell << endl;
从数字上说,这两个地址相同。但从概率上说,&tell[0]是一个2字节内存块的地址,而&tell是以一个20字节的内存块的地址。因此,表达式tell+1将地址值增加2,而&tell+2将地址加20.
如果结构标识符是结构名,则使用句点运算符;如果标识符是指向结构的指针,则使用箭头运算符(->)
自动存储、静态存储和动态存储
数组的替代品
模板类vector
vector<typeName> vt(n_elem);
n_elem可以是整形常量,也可以是整形变量
模版类array
array<typeName, n_elem> arr;
与创建vector不同,n_elem不能是变量
数组、vector、array都可使用标准数组表示法来访问各个元素。
--EOF--
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, 数组
, 存储
, string
, 字符串
对象
,以便于您获取更多的相关知识。