零.前言
数据结构就是把一组相关的数据元素组织起来然后使用他们的策略和方法。
一.自定义类型(struct)
因为C++提供class
来定义我们的数据结构,那是后面的重点,所以我们现在不做讨论,后面我们会详细说明。
1.定义
我们以关键字struct
开始,紧跟着类名和类体(类体可以为空)。类体有花括号包围形成了一个新的作用域。类内部定义的名字必须唯一。但是可以与类外部的名字重复。花括号后面必须写一个分号
常见的定义有两种方式:
struct student
{
/* *** */
}kanna, *ptr_student;
struct student
{
/* *** */
};
student kanna, *ptr_student;
但是我们推荐使用第二种方法,因为第一种方法吧对象的定义和类的定义放在一起,容易惹人心烦。
2.类数据成员
C++11新标准规定,我们可以定义一个类内初始值
如同:
struct student
{
int id = 0;
unsigned level = 9;
};
二.使用类
啊这,这好像没说啥,只讲了.
符号,所以就直接举个例子跳过。
struct goods
{
int id = 0;
int price = 9;
};
goods a, b;
int tot = 0;
a.price = 10;
b.price = 100;
tot = a.price + b.price;
三.编写自己的头文件
为了确保每个文件中类的定义一致,类通常被定义在头文件中,而且类所在的头文件的名字应与类的名字一样。
1.预处理器概述
我们之前已经了解了一个预处理器#include
,现在会新了解一个预处理功能头文件保护符,它依赖于预处理变量
,预处理变量
有两种状态:已定义和未定义。
#define
把一个名字设定成预处理变量
#ifdef
仅当变量的定义为真时(或已被定义)才为真
#ifndef
仅当变量的定义为假时(或未被定义)才为真
当#ifdef 或 # ifndef
为真时,才执行后续操作,直到#endif为止
举个例子,我们的头文件:
#ifndef GOODS_H
#define GOODS_H
struct goods
{
int id = 0;
int price = 9;
};
#endif
如果我们没有定义GOOD_H,我们就执行后面的内容:定义GOOD_H、结构体goods,然后结束。
当然我们嵌入式文件中,也常含有这些定义:
#ifdef DRV_DEBUG
#define DBG_LVL DBG_LOG
#else
#define DBG_LVL DBG_INFO
#endif /* DRV_DEBUG */
如果是DEBUG模式,DBG_LVL就是LOG,否则就是INFO,这样,就可以牵一发而动全身