分号是必须的。
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是个好习惯。