《C++ Primer》学习笔记(第二章)

基本内置类型:
算术类型:字符、整型数、布尔值、浮点数
空类型不对应具体的值

类型 含义 最小尺寸
bool 布尔类型 未定义
char 字符 8bit
wchar_t 宽字符 16bit
char16_t Unicode字符 16bit
char32_t Unicode字符 32bit
short 短整型 16bit
int 整型 16bit
long 长整型 32bit
long long 长整型 64bit
float 单精度浮点数 6位有效数字,32bit
double 双精度浮点数 10位有效数字,64bit
long double 扩展精度浮点数 10位有效数字,96或128bit

布尔类型:真(true) 假(false)
计算机中可寻址最小内存块称为“字节(byte)”,储存的基本单元称为“字(word)”。
一般来说float和double分别有7和16个有效位
带符号:signed(正数、负数或0) 无符号:unsigned(大于等于0)
unsigned int可以简写为unsigned
char, signed char, unsigned char。signed char和char不一样
无法预知的行为源于编译器无须(有时候是不能)检测的错误
如果把int的尺寸看成是一个不变的已知值,那么这样的程序就称作不可移植的
类型char表现可能是带符号的也可能是无符号的,具体是哪种由编译器决定
当一个算术表达式中既有无符号数又有int值时,那个int值就会转换成无符号数
把负数转换成无符号数类似于直接给无符号数赋一个负值,结果等于这个负数加上无符号数的模
字面值常量,每个字面值常量都对应一种数据类型,字面值常量的形式和值决定了它的数据类型
整型和浮点型字面值
十进制字面值的类型是int、long和long long中尺寸最小的那个
八进制和十六进制字面值的类型是能容纳其数值的int、unsigned int、long、unsigned long、long long和unsigned long long中尺寸最小者
short没有对应的字面值
默认的浮点型字面值是一个double
字符串和字符串字面值
由单引号括起来的一个字符称为char型字面值,双引号括起来的零个或多个字符则构成字符串型字面值
转义序列
有两类字符程序员不能直接使用,一类是不可打印的字符,如退格或其他控制字符,另一类是在C++语言中有特殊含义的字符,在这些情况下需要用到转义序列,以反斜线作为开始
响铃符 \a \7
换行符 \n \12
空格 \40
空字符 \0
字符M \115 \x4d
如果反斜线\后面跟着的八进制数字超过3个,只有前3个数字与\构成转义序列
\x要用到后面跟着的所有数字
Best practices:当使用一个长整型字面值时,使用大写字母L来标记,因为小写字母l和数字1容易混淆
字符串和字符串字面值:

前缀 含义 类型
u Unicode 16字符 char16_t
U Unicode 32字符 char32_t
L 宽字符 wchar_t
u8 UTF-8 char

整型字面值

后缀 最小匹配类型
u or U Unsigned
l or L long
ll or LL long long

浮点型字面值

后缀 类型
f或F float
l或L long double

true和false是布尔类型的字面值
nullptr是指针字面值
C++中的每个变量都有其数据类型,变量和对象一般可以互换使用
string是一种库类型,表示一个可变长的字符序列
通常情况下,对象是指一块能储存数据并具有某种类型的内存空间
初始化和赋值是两个完全不同的操作
初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而用一个新值来替代
C++11新标准:花括号初始化变量 (列表初始化)
默认初始化:如果定义变量时没有指定初值,变量被默认初始化,如果是内置类型的变量未被显式初始化,它的值由定义的位置决定。定义于任何函数体之外的变量被初始化为0,定义在函数体内部的内置类型变量将不被初始化,是未定义的。
分离式编译:允许将程序分割为若干个文件,每个文件可被独立编译
为了支持分离式编译,C++语言将声明和定义区分开来
声明使得名字为程序所知,规定了变量的类型和名字;定义负责创建与名字相关的实体,申请储存空间,也可能会为变量赋一个初始值
如果想声明一个变量而非定义它,就在变量名前添加关键字extern
任何包含了显式初始化的声明即成为定义
变量能且只能被定义一次,但是可以被多次声明
静态类型语言:在编译阶段检查类型(类型检查)
定义也是声明:当定义变量时我们声明了它的类型和名字
C++标识符由字母、数字和下划线组成,其中必须以字母或下划线开头
用户自定义的标识符中不能连续出现两个下划线,也不能以下划线紧连大写字母开头,定义在函数体外的标识符不能以下划线开头
全局作用域、块作用域
被包含(嵌套)的作用域称为内层作用域,包含着别的作用域的作用域称为外层作用域
复合类型是指基于其他类型定义的类型:引用和指针
一条声明语句由一个基本数据类型和紧随其后的一个声明符列表组成。每个声明符命名了一个变量并指定该变量为与基本数据类型有关的某种类型
引用为对象起了另外一个名字,通过将声明符写成&d的形式来定义引用类型
引用必须被初始化,因为无法令引用重新绑定到另外一个对象
为引用赋值,实际上是把值赋给了与引用绑定的对象,引用只能绑定在对象上
指针是指向另外一种类型的复合类型
指针与引用相比的不同点:
1.指针本身就是一个对象,且在指针的声明周期内它可以先后指向几个不同的对象
2.指针无须在定义时赋初值,在块作用域内定义指针如果没有被初始化,也将拥有一个不确定的值
指针存放某个对象的地址
取地址符(&)
引用不是对象,没有实际地址,所以不能定义指向引用的指针
指针值:
1.指向一个对象
2.指向紧邻对象所占空间的下一个位置
3.空指针,意味着指针没有指向任何对象
4.无效指针,也就是上述情况之外的其他值
解引用符(*):访问对象
对指针解引用会得出所指的对象,因此如果给解引用的结果赋值,实际上也就是给指针所指的对象赋值
NULL:预处理变量 值为0
预处理变量不属于命名空间std,由预处理器负责管理
赋值永远改变的是等号左侧的对象
void*指针,特殊的类型,可存放任意对象的地址
类型修饰符是声明符的一部分
把修饰符和变量标识符写在一起强调变量具有复合类型,把修饰符和类型名写在一起强调本次声明定义了一种复合类型
**表示指向指针的指针,***表示指向指针的指针的指针
指针式对象,所以存在对指针的引用
Example:

int *p;
int *&r = p;

const限定符:定义一种变量,它的值不能被更改
因为const对象一旦创建后其值就不能再改变,所以const对象必须初始化
只能在const类型的对象上执行不改变其内容的操作
默认情况下,const对象仅在文件内有效
如果想在多个文件之间共享const对象,必须在变量的定义之前添加extern关键字
可以把引用绑定到const对象上,称之为对常量的引用
引用的类型必须与其所引用对象的类型保持一致的第一个例外:
在初始化常量引用时允许用任意表达式作为初始值,允许为一个常量引用绑定非常量的对象、字面值,甚至是个一般表达式
临时量:当编译器需要一个空间来暂存表达式的求值结果时临时创建的一个未命名的对象
常量引用仅对引用可参与的操作做出了限定,对于引用的对象本身是不是一个常量未作限定
指向常量的指针不能用于改变其所指对象的值;指向常量的指针
指针的类型必须与所指对象的类型一致,但是有例外:
第一种例外情况是允许令一个指向常量的指针指向一个非常量对象
常量指针必须初始化,一旦初始化完成则其值就不能更改了,把*放在const关键字之前用以说明指针是一个常量
顶层const表示指针本身是一个常量,底层const表示指针所指的对象是一个常量
顶层const可以表示任意的对象是常量,底层const则与指针和引用等复合类型的基本类型部分有关
用于声明引用的const都是底层const
常量表达式指指不会改变并且在编译过程就能得到计算结果的表达式
在一个复杂系统中,很难分辨一个初始值到底是不是常量表达式
声明为constexpr的变量一定是一个常量,而且必须是常量表达式初始化
一般来说,如果认定变量是一个常量表达式,那就把它声明成constexpr类型
算术类型、引用和指针都属于字面值类型
一个constexpr指针的初始值必须是nullptr或者0,或者是存储于某个固定地址中的对象
函数体内定义的变量一般来说并非存放在固定地址中,定义于所有函数体外的对象其地址固定不变
constexpr把它所定义的对象置为了顶层const
处理类型:
类型别名是某种类型的同义词

typedef关键字

typedef double wages; //wages是double的同义词
typedef wages base, *p; //base是double的同义词,*p是double*的同义词

typedef作为基本数据类型的一部分
别名声明:using SI = int;
用关键字using作为别名声明的开始,其后紧跟别名和等号,把等号左侧的名字规定成等号右侧类型的别名
auto类型说明符,让编译器替我们去分析表达式所属的类型,通过初始值来推算
auto定义的变量必须有初始值
对常量对象取地址是一种底层const
如果希望推断出的auto类型是一个顶层const,需要明确指出:

const auto f = ci;

decltype类型说明符:选择并返回操作数的数据类型,在此过程中,编译器分析表达式并得到它的类型

你可能感兴趣的:(《C++ Primer》学习笔记(第二章))