C++ 复合类型学习笔记

作者:袖梨 2022-06-25

复合类型是基于整形和浮点型创建的。影响最为深远的复合类型是类。

1、数组

数组是一种数据格式,能够存储多个同类型的值。

typeName arrayName[arraySize]

int months[12] = {1, 2, 3};其他元素将设置为0

char name[4] = {'p', 'i', 'g', ''};

不能将一个数组赋值给另一个数组。

2、字符串

存储在内存的连续字节中的一系列字符。C++处理字符串的方式有两种。一种来自C语言,常被称为C-风格字符串,另一种基于string类库的方法。

C-风格字符串:
以空字符 结尾,其ASCII为0,用来标记字符串的结尾。

char name[4] = {'p', 'i', 'g', '!'};//不是字符串

char name[4] = {'p', 'i', 'g', ''};//是字符串

用引号括起的字符串称为字符串常量或字符串字面值,隐式包含结尾的空字符,如:

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] = '';

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 
#include 
 
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 vt(n_elem);

n_elem可以是整形常量,也可以是整形变量

模版类array

array arr;

与创建vector不同,n_elem不能是变量

数组、vector、array都可使用标准数组表示法来访问各个元素。

--EOF--

相关文章

精彩推荐