第二章
2.1
1、带符号数会自动转换成无符号数。
2、如果反斜线\后面跟着的八进制数字超过3个,只有前3个数字与\构成转义序列;\x要用到后面跟着的所有数字。
2.2
1、如果我们使用列表初始化且初始值存在丢失信息的风险,则编译器将报错。
2、定义于任何函数体之外的变量被初始化为0。
3、变量的声明:在变量名前添加关键字extern,而且不要显式地初始化变量。
任何包含了显式初始化的声明即成为定义。
2.3
1.引用与指针
(1)引用(左值引用)即别名。引用必须初始化,且无法令引用重新绑定到另外一个对象上。
(2)指针无需在定义时赋初值;指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象。
(3)生成空指针的方法:
int *p1=nullptr;
int *p3=NULL;
(4)void*指针可以存放任意对象的地址。
2.不能把int变量直接赋值给指针。
3.任何非0指针对应的条件值都是ture。
4.指向指针的引用的定义
int i=42;
int *p; //p是一个int型的指针
int *&r=p; //r是一个对指针p的引用
从右向左阅读r的定义。
2.4
1.const变量仅在文件内有效;extern const变量可以在多个文件之间共享
2.允许令一个指向常量的指针指向一个非常量的对象。
指向常量的指针:const int *i
常量指针(const pointer):int *const i 【一旦初始化完成,它的值就不能再改变】
3.常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式。
4.constexpr变量一定是一个常量,而且必须用常量表达式初始化。一般来说,如果你认定变量是一个常量表达式,那就把他声明成constexpr类型。
5.在constexpr声明中如果定义了一个指针,限定符constexpr仅对指针有效,与指针所指的对象无关。
6.不能为非常量引用绑定字面值。
2.5
1.定义类型别名的两种方法:
(1)typede:
typedef double wages; // wages是double的同义词
(2)using:
using SI=Sales_item; //SI是Sales_item的同义词
2.指针的类型别名与常量
typedef char *pstring;
const pstring cstr=0; //cstr是指向char的常量指针
const pstring *ps; //ps是一个指针,它的对象是指向char的常量指针
不能将类型别名替换成它原本的样子来理解语句含义。
3.auto类型:编译器根据初始值来推算变量类型。
auto一般会忽略掉顶层const,同时底层const则会保留下来;
如果希望推断出的auto是一个顶层const,需要明确指出:
const int ci=0;
const auto f=ci; //ci的推演类型是int,f是const int
设置一个类型为auto的引用时,初始值中的顶层常量属性仍然保留。
4.decltype((variable))的结果永远是引用;而decltype(variable)结果只有当variable本身就是一个引用时才是引用。
2.6
1.头文件通常包含只能被定义一次的实体,如类、const和constexpr变量。
2.预处理器之头文件保护符
#define指令把一个名字设定为预处理变量
#ifdef当且仅当变量已定义时为真
#ifndef当且仅当变量未定义时为真
一旦检查结果为真,则执行后续操作直至遇到#endif指令为止//.
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <string>
struct Sales_data {
std::string bookNo;
unsigned units_sold=0;
double revenue=0.0;
};
#endif