引用
引用定义的时候必须同时初始化,一旦初始化完成,引用将和初始值对象一直绑定在一起。引用无法绑定在字面值或者某个表达式的计算结果上,必须绑定对象上,且绑定的对象和声明的引用类型需严格匹配。
int value = 1024;
int &r; //错误,没有初始化
int &r = value //合法
int &r = 10 //错误
double value = 0.1
int &r = value //错误
指针
指针也是一个对象,允许对指针进行复制和拷贝,它无需在定义时初始化,如果没有初始化则拥有一个不确定的值。编译器不会检查未经初始化的指针(无效指针),所以一个良好的编程习惯是,初始化程序中出现的所有的指针,如果实在不知道指向什么,就初始化为空指针。指针的类型和指向对象的类型需严格一致。
int value = 42;
int *p = &value; //*是声明的一部分,说明p是个指针,&则是一个取地址运算
//初始化空指针
int *r = nullptr;
int *r = 0;
int *r = NULL;
在C++中,变量是对象,指针也是对象,如果一个变量有一个引用之后,那么这个引用就不是对象。不可以设置指针指向这个引用。
int value = 10;
int &r = value;
int *p;
p = r; //错误,引用不是对象,不可以设置指针指向引用。
p = &r; //正确,&r取得了value的地址,地址赋给p,合理,p指向value。
// 指向指针的引用
int i= 42;
int *p;
int *&r = p; //r 是对指针p的引用, 那么r是指针p的别名。
r = &i; //把i的地址赋给r,即赋给p。
*r = 0;
定义类型别名
using SI = Sales_item;
auto
auto 类型表达符**可以让编译器去分析表达式的类型,一条auto的声明语句只能声明一个基本数据类型。
auto i = 0, *p = &i; //正确
auto i = 0, pi = 3.14; //错误
int j = 0, &rj = j;
const int ci = j, &cr = ci;
auto &m1 = ci, *cp1 = &ci; //正确,m1是整型常量的引用,cp1是指向整型常量的指针。
auto m2 = i, *cp2 = &ci; //错误,m2是整型,cp2是指向整型常量的指针。
头文件保护符
头文件保护符,即使头文件还没有被包括在任何其它文件中,也应该设置保护符.防止头文件被某个文件重复包含。
#ifndef SALES_DATA_H
#define SALES_DATA_H
...
#endif