分号是必须的

struct some_data{ /* ... */ } a, b, *c;
// equivalent, but better
struct some_data{ /* ...*/ };
some_data a, b, *c;

C++ 11的新标准是我们能够为数据成员(data member)提供in-class初始化。当我们创建对象时,in-class初始化器用作初始化数据 成员。没有初始化的成员会被默认初始化。

struct Sales_data{
    std:string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};

这里直接在结构体内的初始化成员,在以前的C++是不行的。

但是,in-class初始化的形式是有限制的:要么使用花括号,要么在=。我们不能在圆括号内指定in-class初始化。

类(结构体)的定义

如果在多个不同文件中使用一个类,类的定义必须一致。为了保证类定义在每个文件相同,类一般定义在头文件中。

头文件可能包含一些只能被定义一次的实体。比如,Sales_data.h需要包含string头;因此,使用Sales_data的程序要 包含string两次。因此,我们需要以某种方式安全地写自己的头,即使头被包括多次。

任何时候头被更新,包含该头文件的源文件都得重新编译。

简单介绍预处理器

使能安全地多次包含头文件的最常见的技术是预处理器(preprocessor)

预处理器是一个在编译器前运行的程序,来改变程序的源代码。#include就是预处理器的一个工具;当预处理器遇到#include,它 就替换该头文件的内容。

C++程序还使用预处理器来定义header guards。Header guard依赖预处理器变量;预处理器变量只有两种状态:定义,未定义。

#ifndef SALES_DATA_H
#define SALES_DATA_H
struct Sales_data {
    std:string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};
#endif

习惯性书写header guards是个好习惯。