第2章 变量和基本类型
数据类型分无符号和带符号
编译器类型 | char | short | int | long | float | double | 指针 |
32位编译器 | 1字节 | 2 | 4 | 4 | 4 | 8 | 4 |
64位编译器 | 1字节 | 2 | 4 | 8 | 4 | 8 | 8 |
8比特的signed char范围为-128~127区间
字面值常量
整型和浮点型字面值:
默认整型字面值为double
字符和字符串字面值:
编译器在每个字符串的结尾处添加一个空字符(’\0’),因此,字符串字面值的实际长度比它的内容多1
除了常见的字符类型,还有一些不常见的字符类型,用于扩展字符集,如wchar_t
、char16_t
、chat32_t
wchar_t
类型用于确保可以存放机器最大扩展字符集中任意一个字符
char16_t
类型和char32_t
则为Unicode字符集服务
指定字面值的类型
布尔字面值和指针字面值
true和false是布尔类型的字面值
nullptr是指针字面值
变量
对于C++程序员来说,变量
和对象
一般可以互换使用
通常情况下,对象是指一块能存储数据并具有某种类型的内存空间
初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值
赋值的含义是把对象当前值擦除,而以一个新值来替代
几种初始化方法:
int a = 0; int a = {0}; //叫做列表初始化 int a{0}; int a(0);
如果我们使用列表初始化且初始值存在丢失信息的风险,则编译器将报错
默认初始化
如果定义变量时没有指定初值,则变量被默认初始化
每个类各自决定其初始化对象的方式。
例如int默认初始化为0,string默认初始化为空字符串。
变量声明和定义的关系
声明使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明
定义负责创建与名字关联的实体
变量声明规定了变量的类型和名字,在这一点上定义与之相同。
定义还申请存储空间,也可能为变量赋一个初始值
声明不能显示初始化,加上了显示初始化则为定义
声明用关键字
extern
extern int i; //声明i而非定义i int j; //声明并定义j extern double pi = 3.14 //定义
变量只能被定义一次,可以声明很多次
C++是一种静态类型语言
C++中作用域以花括号分隔
复合类型
引用和指针
引用和指针实现了对其他对象的间接访问
引用
我们说引用一般是指左值引用
,C++11还新增了右值引用
引用必须初始化
引用并非对象,所以不能定义引用的引用
引用类型的初始值必须是一个对象,且是同一数据类型的对象;不能是字面值
引用只能绑定一次
int &a = 10; //错误:引用类型的初始值必须是一个对象 const int &b = 0; //正确,可以为常量引用绑定字面值
指针
指针本身是对象,而引用不是
指针无需在定义时赋初始值
int *P = &ival; //p存放变量ival的地址,或者说p是指向变量ival的指针
空指针
生成空指针的几种方法:
int *p = nullptr; //C++11新标准 int *p = 0; int *p = NULL;
注意:int变量直接付给指针是错误的,恰好等于0也不行
int zero = 0; int *pi = zero; //错误
void*
指针
可以存放任意对象的地址,并不知道这个对象到底是什么类型
指针的指针
const限定符
const对象一旦创建其值就不能再改变,所以const对象必须初始化
默认状态下,const对象仅在该cpp文件内有效;除非加extern声明
常量引用
const int ci = 1024; const int &r1 = ci; //现在r1和ci都是常量1024 int &r2 = ci; //错误
int i = 42; const int &r3 = i; //可以,但是不允许通过r3修改i r3 = 40; //错误 i = 41; //正确 cout << r3 << endl; //41
const int * P
:指向常量的指针,底层const
int * const p
:常量指针,顶层const,不能修改p的值,即不能修改地址
const int * const p
:指向常量的常量指针
用顶层const
表示指针本身是个常量
用底层const
表示指针所指的对象是一个常量
更一般的,顶层const可以表示任意的对象是常量
const int ci = 42; //顶层const
常量表达式
是指值不会改变并且在编译过程中就能得到计算结果的表达式,可用constexpr
修饰
constexpr int mf = 20;
类型别名
typedef double wages; //wages是double的同义词 using SI = Sales_item; //SI是Sales_item的同义词
auto类型说明符
C++11新标准引入
auto定义的变量必须有初始值
auto一般会忽略掉顶层const,同时底层const则会保留下来
decltype类型指示符
C++11新标准
选择并返回操作数的数据类型
decltype(f()) sum = x; //sum类型就是函数f()的返回类型
返回类型包含顶层const和引用在内
auto,decltype都是类型说明符
decltype((i)) d; //错误:d是int&,必须初始化 注意:双层括号结果永远是引用 decltype(i) e; //正确:e是一个未初始化的int
int a = 3, b = 4; decltype(a = b) d = a; //d是int & 型 4
头文件定义
防止重复包含的发生:
#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
#define是一条预处理指令,用于定义一个预处理变量
#endif是一条预处理指令,用于结束一个#ifdef或#ifndef区域
#ifdef是一条预处理指令,用于判断给定的变量是否已经定义
#ifndef是一条预处理指令,用于判断给定的变量是否尚未定义