基本的内置数据类型

基本数据类型

类型 关键字
布尔型 bool
字符型 char
整型 int
浮点型 float
双浮点型 double
无类型 void
宽字符型 wchar_t

基本的数据类型可以使用如下的四种修饰符修饰:

  • signed
  • unsigned
  • short
  • long

类型别名

使用typedef为某种数据类型起一个别名:

1
typedef typerName newTypeName

转义序列

字符名称 C++代码
换行符 \n
水平制表符 \t
垂直制表符 \v
退格 \b
回车/返回行首 \r
振铃 \a
反斜杠 \
问号 \?
单引号 \’
双引号 \’’

复合数据类型

数组

数组的声明与初始化方式

  • int array[3];array[0] = 1;array[1] = 2;array[2] = 3;
  • int array[3] = {1,2,3}
  • int array[5] = {1,2} // 1,2,0,0,0
  • int array[5] = {0} // 0,0,0,0,0
  • int array[] = {1,2,3} // size of the array is 3

获取数组长度:

sizeof array / sizeof (int)

字符串

C风格的字符串

使用char数组存储字符串:一种C风格的字符串表达形式,需要使用 '\0' 做结尾才可以成为一个字符串

  • char string1[5] = {'h','e','l','l','o'}; // not a string
  • char string1[6] = {'h','e','l','l','o','\0'}; // a string
  • char string2[6]="hello"; // '\0'可以被编辑器理解到并自行添加到末尾
  • char string3[] = "hello"; // 编辑器可以自己确定数组的大小(6)

获取一个C风格字符串的长度(不包括末尾的\0):strlen(string1)

字符串的输入

已知:char hello[20];

  • cin >> hello:cin使用空白(空格、制表符和换行符)来确定字符串的结束位置,也就是说在cin读取到任何空白的时候都会结束输入,将剩余的部分保留在输入队列(输入流)中等待下一个输入命令来读取,(注意cin会读取掉该空白符,即空白符不再留在输入队列中),所以使用cin只能读取相应大小(比如此处的20)以内并且不含有空白符的字符串
  • cin.getline(hello,20):面向行的输入,它使用回车键输入的换行符来确定输入结尾,第二个参数表示其最多读取的字符个数+1后的值,即此处最多读取19个字符,所以这种方法读取指定长度的字符后或者遇到换行符后结束读取。
  • cin.get()
    • cin.get(hello,20):和 cin.getline(hello,20) 效果相同,唯一不同的地方是,cin.get() 会将读取到的换行符保留在输入流中,不是将其读入或者丢弃。此时如果进行下一次 cin.get() 或者是 cin.getline() 都会使得被保留的换行符结束它们,使得他们什么都读不到(除了那个被保留在输入队列队首的换行符)。
    • cin.get(hello,20); cin.get(); cin.get(hello,20); :在使用完一次 cin.get(arrayName,arraySize) 后再次使用 cin.get() 将那个换行符读进来可以解决这个问题。
    • cin.get(hello,20).get():上一种方法的简写
    • (cin >> something).get():在cin后追加get()的简写
    • 同理,cin,getline(hello,20).getline(hello,20):连续使用 cin.getline() 读取两次的简写模式

string类

使用 string 类前必须包含 string 头文件:#include<string>

string的声明与初始化

  • string myString;
  • string myString = "hello world!";
  • string mystring = {"hello world!"};
  • string myString1 = "hello world!";string myString2 = myString1;

string的赋值、拼接与附加

  • string myString1 = "hello world!";string myString2 = myString1;
  • string myString3;
  • myString3 = myString1 + myString2;
  • myString1 += myString2;

string类输入

1
getline(cin,stringName)

结构体(struct)

结构体的定义

1
2
3
4
5
struct structType
{
dataType dateName1;
dataType dataName2;
};

结构体的声明与初始化

  • structType structName1;
  • structType structName1 = {data1,data2};
  • structType structName2 = structName1;
  • structName1.dataName1 = data1;
  • 在定义完结构体后直接声明一个结构体:

    1
    2
    3
    4
    5
    6
    7
    8
    struct structType
    {
    dataType dateName1;
    dataType dataName2;
    }structName={
    data1,
    data2
    };
  • 只声明一个结构,可以不提前定义结构体:

    1
    2
    3
    4
    5
    struct
    {
    dataType dateName1;
    dataType dataName2;
    }structName;

结构体数组

假设已经定义了结构体结构:

1
2
3
4
5
struct structType
{
dataType dateName1;
dataType dataName2;
};

初始化一个结构体数组:

  • 先声明再逐个初始化

    1
    2
    structType structArrayName[2];
    structArrayName[0]={data1,data2};
  • 声明的同时初始化

    1
    2
    3
    4
    5
    structArrayName[2]=
    {
    {data1,data2},
    {data1,data2}
    };

共用体(union)

共用体和结构体类似,但是不同点在于结构体可以同时存储多种数据结构,但是共用体只能在同一时间存储一种数据结构

1
2
3
4
5
6
7
8
9
union myUnion
{
int myInt;
double myDouble;
};

myUnion union1;
union1.myInt = 1; // 此时union1存储的是整数1
union1.myDouble = 1.1; // 此时union1存储的是双精度的浮点数1.1

枚举(enum)

枚举的声明

1
2
3
enum colors {red,blue,green,yellow};     // red=0, blue=1, green=2, yellow=3
colors myColor = red; // myColor = 0
colors myColor = colors(2) // myColor = green = 2

即枚举变量只能付给已经定义的几个值中的一个,不能赋予其他值

枚举的值

  • 可以在每一个枚举变量后为其赋值,如果没有赋值的话该枚举值是前一个值+1

    1
    2
    enum numbers {one=1, two=2, four=4, eight=8}
    enum numbers {one=1, two=2, four=4, five, eight=8} // five = 5
  • 枚举的值实际上定义了一个范围,比如 enum numbers {one=1, two=2, four=4, eight=8} 中,如下的语句是合法的:

    1
    numbers myNumber = numbers(6);

虽然6没有被定义,但是却在定义的枚举值的范围内,是合法的。

枚举值的范围的计算方式:

  • 计算上限:找到定义的枚举值的最大值(比如100);找到比这个最大值大的最小的一个2的幂(比如比100大的最小的是2的7次幂128);将这个2的幂数减一(127)即为上限
  • 计算下限:
  • 如果已经定义的枚举值的最小值比0大或等于0,则下限是0
  • 如果已经定义的枚举值的最小值比0小,则和计算上限的方式类似:先找到比这个定义的最小值(比如-6)小的,最大的2的次幂(-8);将这个次幂数加一(-7)即为下限

vector模板类

使用vector模板类需要引入头文件:#include<vector>
vector可以存储n个(n可以为变量)该类型的数据:

1
2
vector<dataType> vt(dataSize);     // dataSize大小的dataType数据类型的对象
vector<int> vi; // 0大小的整型数组

  • 优点:可以动态改变长度
  • 缺点:效率比数组稍低

array模板类

使用array模板类需要引入头文件:#include<array>
array模板类可以存储固定长度的某种数据类型的一个数组:

1
2
3
array<dataType, arraySize> arrayName;
array<int,5> arrayInt; // 创建一个5个int值的数组对象
array<double,3> arrayDouble = {1.1,1.2,1.3}; // 创建并初始化了一个3个double值的数组对象

  • 有点:效率较快
  • 缺点:只能声明固定长度的数组

二维数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
dataType arrayName [row] [column]=
{
{datas},
{datas}
};

dataType arrayName [row] [column];
for(int i = 0; i < row; i++)
{
for(int j = 0; j < column; j++)
{
arrayName[i][j]=data;
}
}