C++Primer 2.6: Custom Data Structure
Defining Our own Data Structure
通常来说,一个data structure指的是如何组织相关数据的方法和如何操作这些数据的策略。在C++中,我们通过class
或者struct
来定义我们自己的数据结构:
struct Sales_data{
string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
}; // must have semicolon
在这里我们通过struct
定义了一个Sales_data
的数据结构,其中大括号里面定义的变量称为data members
(数据成员)。一个类中的数据成员定义了这个类的对象中的内容。类的每一个对象都有自己的数据成员的copy。一个类中的数据成员中的每个变量都不能重复,但是可以和这个类的作用域以外的变量同名(不属于这个scope)。
需要注意的是,这里我们只是在类中定义了数据成员,而没有定义operation和函数,实际上一个类中还可以重载操作符和定义函数。因为这一章并不是主要讲解类(class)的使用,所以此时我们只使用了struct
来做演示。这里的struct
实际上更像是C的用法,因为其只定义了data member
。但是在C++中,struct
实际上也是定义了一个类,也可以继承,也可以定义构造函数等,所以C++中的struct
是C中的struct
的扩展与改进。关于struct
和class
的区别,也可以查看here。
Tips:
- 类的定义通常写在头文件中,并且这个头文件通常以这个类的名字命名。
- 一旦头文件变化,包含这个头文件的源文件都会被重新编译。这也是为什么函数一般不会定义在源文件,因为函数经常变化,这样会导致编译效率降低。
- 头文件通常包含
entities
(因为只能被定义一次),例如definition
,const
和constexpr
变量。因此需要preprocessor来定义header guards
来保证头文件只被展开一次。头文件都应该增加header guards
,哪怕这个头文件不被其他源文件包含。
Header guards
的实现依靠preprocessor variable
。一个preprocessor variable
有两个状态:defined
和undefined
。一个header guards
的例子如下:
#ifndef __TEST_H__
// true if the variable `__TEST_H__` has not been defined
#define __TEST_H__
// define the preprocessor variable `__TEST_H__`
extern const int ci = 42;
#endif
#ifndef
用于判断这个变量__TEST_H__
是否已经被定义,如果没定义则为true
,继续往下执行,即接着#define __TEST_H__
定义这个变量,且执行我们真正想要在头文件中定义的变量的代码;否则会跳到#endif
。需要注意的是preprocessor variable
并不是我们自己C++程序本身的变量,所以并不遵循C++ scoping rules。并且preprocessor variable
在整个程序中都必须unique,所以在实践中我们通常会把它定义为__[header name]_H__
。
因为之前需要些很多coursework,所以我写了一个mac下的C项目模板快速生成脚本,包含了用于编译的Makefile
,以及快速创建.h
文件和.c
文件的脚本,还有在submit作业的时候进行检查的脚本,看是否有相应的文件遗失。其中快速创建的.h
文件都是包含了header guards
。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 gzrjzcx@qq.com
文章标题:C++Primer 2.6: Custom Data Structure
文章字数:810
本文作者:Alex Zou
发布时间:2019-11-24, 12:04:25
最后更新:2024-07-10, 03:02:36
原始链接:https://www.hellscript.cc/2019/11/24/subposts_cppPrimer/CPN-2-6-Custom-Data-Structure/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。