C++Primer 2.6: Custom Data Structure

  1. Defining Our own 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的扩展与改进。关于structclass的区别,也可以查看here

Tips:

  • 类的定义通常写在头文件中,并且这个头文件通常以这个类的名字命名。
  • 一旦头文件变化,包含这个头文件的源文件都会被重新编译。这也是为什么函数一般不会定义在源文件,因为函数经常变化,这样会导致编译效率降低。
  • 头文件通常包含entities(因为只能被定义一次),例如definitionconstconstexpr变量。因此需要preprocessor来定义header guards来保证头文件只被展开一次。头文件都应该增加header guards,哪怕这个头文件不被其他源文件包含。

Header guards的实现依靠preprocessor variable。一个preprocessor variable有两个状态:definedundefined。一个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" 转载请保留原文链接及作者。

目录
×

有钱的捧个钱场,没钱的借钱也捧个钱场