类型

本文将针对C++中常见类型及其特点和应用场景进行总结。

数组

数组是C/C++中非常常见的一种类型,这里总结一些常见的比较容易出错的数组相关知识。

初始化

一种不太常见的初始化方式

在阅读xv6操作系统源码时,看到了这样一种数组初始化方式:

1
2
3
4
5
6
static const char * const error_string[MAXERROR] = {
[E_UNSPECIFIED] = "unspecified error",
[E_BAD_ENV] = "bad environment",
...
[E_FAULT] = "segmentation fault",
};

里面的大写都是宏定义,即具体的数字,实际跑了一下,发现可以部分初始化,而且最后加不加逗号均可以编译通过,这里进行一下记录。

枚举类型

枚举类型属于字面值常量,它使我们可以将一组整型常量组织在一起,C++11后,我们有了两种枚举类型:限定作用域与不限定作用域的枚举类型

限定与不限定作用域的枚举类型

1
2
3
4
5
6
7
enum color {red, yellow, green};   //不限定作用域
enum stoplight {red, yellow, green}; //错误,重复定义枚举成员

enum class peppers {red, yellow, green}; //正确,限定作用域,枚举成员被隐藏

color hair = red; //正确,使用不限定作用域的枚举成员
peppers p2 = peppers::red; //正确,使用限定作用域的枚举成员

枚举的应用场景

在使用常量的场合,我们可以广泛使用枚举类型,例如我们要去造一辆小汽车,这个汽车可以向前后左右四个方向行驶,那么我们可以定义如下枚举体:

1
2
3
4
5
6
7
enum Movement {
None = 0,
Left,
Right,
Forward,
Backward
};

一些特殊的类型

size_t

在很多代码中我们都见过size_t这个类型,它被定义为”某个对象的大小(单位byte)”,同时,这个类型也是sizeof 操作符的返回类型。这个类型可以保证容纳系统能够处理的最大对象的size值,如果系统是32位,那么size_t为typedef size_t unsigned int,而如果是64位,则为unsigned long long。需要注意的是size_t永远为正。

1
2
3
4
5
6
7
8
9
10
11
// Here argument of 'n' refers to maximum blocks that can be 
// allocated which is guaranteed to be non-negative.
void *malloc(size_t n);

// While copying 'n' bytes from 's2' to 's1'
// n must be non-negative integer.
void *memcpy(void *s1, void const *s2, size_t n);

// strlen() uses size_t because the length of any string
// will always be at least 0.
size_t strlen(char const *s);

凡是涉及到类型大小的,尽量使用size_t

类型处理

定义类型别名(typedef)

1
2
3
4
5
6
7
//方法1
// typedef 原在前,新在后,和define正好相反
typedef double wages; // wages 是 double同义词
typedef wages base, *p; // base是double同义词,p是double* 同义词

//方法2
using uint32_t = unsigned int;

一些比较复杂的typedef理解

1 定义函数指针

有时候我们会看到这样的typedef:

1
2
3
typedef void (*new_handler)(void);

//typedef 返回类型 (*新类型) (参数表)

实际上是给函数指针起了一个别名,首先,我们先来看一下:void (*new_handler)();,这个语句定义了一个函数指针,其返回类型为void,参数为void,函数名为new_handler。使用typedef可以令函数指针的使用更直观,此时我们可以直接使用new_handler定义一个函数指针:

1
2
new_handler set_new_handler(new_handler p) throw();
//定义了一个函数,其返回值为new_handler类型,即函数指针,输入参数也是一个函数指针

类型转换

C++提供了四种强制类型转换

参考文献

0%