2.11
一字节等于4位
char 1字 = 4字节 = 32bite
int 4字
double 8字
2.12
无符号 unsigned + int/char 超出范围的话,结果是取模后的余数
如unsigned char 的范围是0-255,将-1赋值给这个类型,结果是1%256的余数,结果是255。
无符号数和有符号数相加,会得到无符号数。
2.13
以0开头的整数代表八进制数,以0x开头的是十六进制数
2.21
变量就是对象
2.22
多个文件中使用同一变量,声明和定义就要分离
声明:仅仅使名字被程序所知 extern int i;
定义:负责创建与名字关联的实体。
extern包含初始值就会变成定义 extern int i= 6 抵消了extern的作用
变量只能被定义一次,但是能多次被声明
c++是静态类型的语言,会在编译阶段进行类型检查
2.23
自定义的标识符不能连续出现两个下划线,也不能下划线紧连大写字母开头。
2.24
::作用域运算符
当全局变量与局部变量同名时,局部变量中的变量名前加::,换成全局变量。
2.31 引用
声明语句 = 基本数据类型+声明符
引用就是给对象起了另外一个名字
引用必须初始化一个对象,并一直绑定
2.32 指针
指针与引用的区别:
1、指针本身就是个对象,可以对指针复制或者拷贝等,而且指针可以变更所指的对象
2、指针可以在定义时不赋值,而是赋值nullptr
所有类型的指针都是占用四个字节(一个字)的空间。
定义空指针:int *p = nullptr;
void*指针也可以存放地址,但是并不知道所存对象是什么类型,因此没办法访问内存对象。
2.33 复合类型的声明
可以存在对指针的引用
int *p;
int *&r = p;
2.4 const 限定符
多个文件要共享const对象的话,要在定义时就加extern const
2.4.1 const的引用
不能用非常量引用去指向常量对象
例如 const int ci = 100;
int &r = ci; 错误
2.4.2 指针和const
指向常量的指针不能用于改变所指对象的值
常量指针:必须初始化,一但初始化完成,指针存放的地址就不能改变了,*在const之前
2.4.3 顶层const
顶层const:表示指针是个常量,也就是常量指针
例如:int* const a = &b;
int i = 0, const int ci = i, 这也是顶层const
底层const:指针所指的对象是个常量
例如:int const *a = &b 或 cosnt int* a = &b;
用于声明引用的const都是底层const
例如:const int c = 40; const int &r = c;
顶层const不受拷贝的影响,底层const必须拷入和拷出的对象都具有底层const,或者非常量转成常量。
2.4.4
常量表达式:值不会改变,在编译过程中就能得到编译结果的表达式。
声明一个常量表达式:constexpr int a = 20;
constexpr声明指针的话,仅对指针有效,而与所指对象无关。
constexpr int *q = pullptr; 常量指针
如果将constexpr换成const,这就是一个指向常量的指针
2.5.1
using a = b;
a是b的别名
2.5.2 auto类型
auto会忽略顶层const,同时底层const会被保留下来。
int i = 0; const int ci = i;
auto b = ci;这时b是int型,顶层const被忽略
2.5.3 decltype
decltype(f()) sum = x;其中f()函数返回的类型,就是sum的类型
decltype 里面如果是常量,那么被指定为这个常量的类型
如果decltype里面是解引用的话,decltype会得到引用类型,例如decltype(*p)c, c会得到int&类型
如果decltype中的表达式加上了括号,那么结果将是引用
2.6.1 定义struct类型
类内初始值:可以在类内对数据成员进行初始化了。
struct sale_data{
string book;
unsigned sold = 0; //初始化
}
2.6.3 编写头文件
预处理器 确保头文件多次包含仍能安全工作,这是在编译之前执行的一段程序。
文件保护符避免了一个头文件被多次包含进同一个源文件。
#define 接受一个名字并定义这个名字为预处理器变量
#ifndef 检测预处理器变量是否未定义
头文件模板:
#ifndef A_H (a_h是头文件中类的名字,建议大写)
#define A_H
//头文件内容
#endif