初始化/赋值语句:将某个值与一个对象关联起来
- 值:字面值、对象所表示的值
- 标识符:变量、常量、引用
- 初始化基本操作:在内存中开辟空间,保存相应的数值。在编译器中构造符号表,将标识符与相关空间关联起来
- 值与对象都有类型
- 初始化/赋值可能涉及类型转换
类型描述了
- 存储所需要的尺寸 int 4个字节 char 1个字节 但是并没有严格限制
- 取值空间 超过范围可能产生溢出 上溢出变最小值,下溢出变最大值
- 对齐信息:char是1,int是4
- 操作
基本类型
数值类型:字符类型(char,wchar_t,char16_t,char32_t)、整数类型(带符号,shot,int,long,long long。无符号:unsigned+带符号整数类型)、浮点类型(float,double,long double)、void
复杂类型
由基本类型组合、变种所产生的类型,可能是标准库引入或自定义类型
与类型相关的标准未定义部分
- char是否有符号
- 整数中内存中保存的方法:大端 小端
- 每种类型的大小(间接影响取值范围 )
字面值及其类型
- 整数字面值: 20,024,0x14。十进制,八进制,十六进制
- 浮点数:1.3,1e8 - double型
- 字符字面值: 'c','/n','/x4d' - char型
- 字符串字面值: "Hello" - char[6] 型
- 布尔字面值: true,false - bool 型
- 指针字面值:nullptr - nullptr_t 型
变量及其类型
变量:对应了一段存储空间,可以改变其中内容
变量的类型在其首次申明(定义)时指定:
- int x:定义一个变量x,其类型为int
- 变量申明与定义的区别:extern 前缀
变量的初始化与赋值
- 初始化:在构造变量之初为其赋予的初始值 缺省初始化(int x,在函数中是任意值,全局变量赋予0)、直接/拷贝初始化、其他初始化
- 赋值:修改变量所保存的数值
指针:一种间接类型
指针同样是开辟一段空间,保存对象对应内存的首地址。指针的空间本身也有编号。
特点
- 可以指向不同的对象
int main()
{
int x = 42;
int y = 56;
int* p = &x;
p = &y;
}
- 具有相同的尺寸
相关操作
- &-取地址操作符
- *-解引用操作符
int main()
{
int x = 42;
int* p = &x;
cout<< *p <
尽管指针具有相同的尺寸,但是解引用操作符时候会根据指针的类型去解引用
缺省初始化指针时一般不解引用,因此一般需要在初始化时赋值
指针的定义:nullptr,表示空指针,因此初始化时可以写int* = nullptr;
指针与bool的隐式转换:非空为true,空为false
指针加1、指针减1:按照指针类型往后或者往前类型大小的字节
比较大小:一般在数组内部比较
void* 指针
- 没有记录对象的尺寸信息,可以保存任意地址。可以跟任何指针做转换
- 支持判等操作
指针的指针: int** pp = &p
指针vs对象:指针复制成本低,读写成本高
引用:
int main()
{
int x = 3;
int& ref = x;//申明类型:引用。相当于给x加了个别名
}
在构造的时候绑定对象,在生命周期不能改变。
指针也是对象,因此可以定义引用。
int main()
{
int x = 3;
int* ptr = &x;
int*& ref = ptr;
}
从右到左来看是指针还是引用,最近的是什么就是什么。
不能构造引用的引用。引用不是一个对象
常量与变量相对,表示不可修改的对象
- 使用const申明常量对象
- 是编译期概念,编译器利用其防止非法操作、优化程序逻辑
常量指针与顶层常量
- const int* p;不能使用p改变指针的值
- int* const p;指的是指针不能修改
区别在于const和*的相对位置
- const int* const p;
- 常量指针可以指向变量
常量引用(也可绑定变量)
- const int&
- 可读但不可写
- 主要用于函数形参
- 可以绑定字面值
常量表达式
- 使用constexpr声明
- 申明的是编译器常量
- 编译器可以利用其进行优化
- 常量表达式指针: constexpr 位于 *左侧,但表示指针是常量表达式
类型别名
可以为类型引入别名,从而引入特殊的含义或便于使用 typedef int MyInt 或者 using MyInt = int
使用using引入类型别名更好
typedef char MyCharArr[4]
using MyCharArr = char[4]
类型的自动推导
auto 编译器自动推导,会产生类型退化(定义的变量放在后边作为右值的时候会产生类型退化
const auto/constexpr auto:推导出的是常量/常量表达式
auto&: 推导出引用类型,防止类型退化
域(scope)表示了程序中的一部分,其中的名称有唯一的含义
全局域:程序最外围的域。对象的生命周期是整个程序的运行区间
块域:用大括号限定的域。