2.1 基本内置类型
- 当明确知晓数值不可能为负时,选用无符号类型
- int爆了就直接用
long long
- 浮点直接用`double
2.2 变量
对与C++程序员,
变量variable
和对象object
一般可以互换使用- 对象:通常指一块能够存储数据并具有某种类型的内存空间
初始化与赋值是两个完全不同的概念:
- 初始化:创建变量时赋予一个初始值
- 赋值:将对象的当前值擦除,而以一个新值来代替
- 列表初始化:
int a = 0;
int a = {0};
int a{0};
int a(0);
2.3 复合类型
每条声明语句由一个基本数据类型(base type)和紧随其后的声明符(declarator)列表构成
- 声明符为变量名时变量的类型就是基本数据类型
引用
- reference
- 指的是“左值引用(lvalue reference)”,C++11新增了“右值引用(rvalue reference)”
- 引用就是给对象起了另外一个名字
int a = 1024;
int &b = a;//b指向a(b是a的另外一个名字)
int &c;//报错
引用必须被初始化
- 在定义引用时,它会与初始值
绑定bind
在一起,无法再重新绑定,所以必须初始化 - 引用必须绑定在对象上
- 在定义引用时,它会与初始值
- 引用即别名:引用并非对象,而是为已经存在的对象另起别名
指针
point
是指向
另外一种类型的复合类型,也实现了对其他对象的间接访问与引用区别:
- 指针本身就是一个对象,允许对指针赋值和拷贝,可在生命周期内先后指向多个对象
- 无需在定义时赋初值
- 在块作用域未初始化会拥有一个不确定的值
double dp, *dp2;//dp是double型对象,dp2是指向double类对象的指针
- 获取对象的指针
int *p = &ival;
引用和取地址共用符号&
- 利用指针访问对象
int *p = &ival;
cout << *p;
空指针:
- null pointer
int *p1 = nullptr; // 等价 int *p1 = 0;
int *p2 = 0; // 直接初始化为字面常量0
#include cstdlib
int *p3 = NULL; // 等价 int *p3 = 0;
- 最好使用第一种(c++11新标准)
- 最好初始化所有指针
int zero = 0;
pi = zero;
是错误的,即使zero为0,不能吧int变量赋给指针
tips:
- 任何非0指针对应的条件值都是true;
void*
指针- void* 是特殊指针类型,可存放任何对象的地址
- 我们不能知道该地址到底是个什么类型的对象
理解复合声明
- 定义多个变量
- 指向指针的指针
- 指向指针的引用:引用本身不是对象,所以不能有指向引用的指针,但指针是对象,可以有对指针的引用
2.4 const
2.4.1 const限定符
- const对象必须初始化
- const的引用
const int ci = 1024; //right
const int &r1 = ci; //right,引用及其对象都是常量
r1 = 42; //错误:r1是对常量的引用
int &r2 = ci; //错误:试图让一个非常量引用指向一个常量对象
引用的类型必须与其引用对象的类型一致:(除两种特殊情况)
- 在初始化常量引用时允许用任何表达式作为初始值,只要能强制类型转换就行[
临时量
] - 为常量引用绑定一个非常量
- 在初始化常量引用时允许用任何表达式作为初始值,只要能强制类型转换就行[
2.4.2 指针和const
- 指向常量的指针不能用于改变其所指对象的值
- tips:
所谓指向常量的指针和引用
,不过是指针或引用自以为是
罢了,它们觉得自己指向了常量,所以自觉地不去改变所指对象的值
- 常量指针必须初始化
2.4.3 顶层/底层指针
- 顶层指针:
top-level const
:指针本身就是个常量 - 底层指针:
low_level const
:指针所指的对象是个常量 - 一眼顶真o(^^o)
2.4.4 constexpr
- 将变量声明为
constexpr
,以便编译器来验证变量的值是否是一个常量表达式
constexpr int chsm = 20;//20是常量表达式
constexpr int sz = size();//只有当size是一个constexpr函数
//其才是一条正确的声明语句
- 一般来说,如果你认定一个变量是常量表达式,就把它声明成constexpr类型
- constexpr与指针:
此限定符只对指针有效,与指针所指对象无关
const int *p = chsm; //p是一个指向整型常量的指针
constexpr int *q = chsm;//q是一个指向整数的常量指针
- constexpr将其定义的对象设置为了顶层指针
2.5 处理类型
2.5.1 类型别名
- typedef
typedef oldname newname
- 别名声明
alias declaration
using newname = oldname;
- 符合类型不能简单的翻译回去理解
typedef char *pst;
const pst cstr = 0;
const char* cstr = 0
是对const pst cstr = 0的错误理解
改写前声明了一个指向char的常量指针
改写后声明了一个指向const char的指针(*成了声明符的一部分)
2.5.2 auto
类型说明符
- 让编译器去分析表达式所属类型
auto item = i1 + i2;
根据相加结果推断出item的类型
- auto一般会忽略掉顶层const,若需保留则自己手动声明
- 设置一个引用类型为auto,则初始值中的顶层const依然保留
2.5.3 decltype
类型指示符
decltype( f() ) sum = x;
sum的类型由函数f的返回值绝对,decltype并不实际调用f()
- decltype的括号:
decltype( (i) ) d;
decltype ( i ) d;
双层括号的结果永远是引用,单括号只有当i本身为引用时才为引用
2.6 自定义数据结构
没学到class前一直用struct就好
2.6.3 编写自己的头文件
- 头文件保护符
#ifndef SALS_DATA_H
#define SALS_DATA_H
#include <string>
struct Sales_data{
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
#endif
- 别想自己的程序用不用的到,加上就完事了