第三章
面向对象的本质是设计并扩展自己的数据类型。
内置的C++类型:基本类型和复合类型
3.1 简单变量
变量名
以下划线开头或大写字母开头的变量名保留给编译器及其使用的资源。
使用_time, _Donut 不会导致编译器错误, 但会导致行为的不确定性
长度不限
整型
char
short 至少16位
int 至少与short一样长
long 至少32位, 至少与int一样长
long long 至少64位, 至少与long一样长 // C++ 11
运算符sizeof和头文件limits
简单介绍 #define 和 const
如果需要与C兼容, 必须使用 #define
初始化
初始化:将声明与赋值结合到一起
int n_int = INT_MAX; // 来自C
C++
int owls = 101;
int wrens(432);
C++11的初始化方式
int a = {24};
int b{32};
int c{}; // 初始化为0
int d = {}; // 初始化为0
// 大括号初始化器可以用于任何类型
无符号类型
每种整形都有一种无符号类型
unsigned char
unsigned short
unsigned int // 缩写 unsigned
unsigned long
unsigned long long
选择整型类型
整型字面值
C++使用前一(两)位标识数字常量的基数(进制)
第一位:1~9 10
第一位:0, 第二位:1~7 8
前两位:0X/0x 16
正常情况下, cout 以十进制格式输出
计算机内部储存形式都为二进制
控制 cout 以不同形式的进制输出
dec hex oct // 实际上是一条消息, 告诉 cout 采取何种行动, 命名空间 std
cout << hex;
cout << dec;
cout << oct;
确定常量的类型
除非有特别的理由(后缀或存不下), 否则常量将被储存为 int 类型
后缀:
l/L : long
u/U : unsigned int
ul/UL : unsigned long
C++11 : ull Ull uLL ULL
不带后缀
十进制数
int long long long // 用能存放的最小类型表示
十六进制/八进制
int unsigned int long / unsigned long long long / unsigned long long // 用能存放的最小类型表示
char 类型:字符和小整数
成员函数cout.put()
char字面值
转义序列
\a : 终端扬声器振铃
可以基于字符的八进制和十六进制编码来使用转义序列
Ctrl + Z 26 '\032' '\x1a'
通用字符名
源字符集:可以用来编写源代码的字符集
执行字符集:包括在程序执行期间可以处理的字符(文件读取、显示到屏幕上的字符)
基本源字符集、基本执行字符集
扩展源字符集、扩展执行字符集
通用字符名的用法
以\u或\U打头
\u 后面是8个十六进制位
\U 后面是16个十六进制位
这些位表示的是ISO 10646的编码, Unicode 与 ISO10646
如果支持扩展字符集, 就可以使用通用字符名
int k\u00F6rper;
cout << "Let them eat g\u00F6rper"
signed char 和 unsigned char
char // 表示的可能是 unsigned char 也可能是 signed char
使用 char 存储 ASCII 字符, 有没有符号都没有关系
wchar_t
底层类型
当基本字符集为较大的字符集时, char 可以被厂商设置为16位或更长
当基本字符集较小, 扩展字符集较大时, char 可以表示基本字符集, wchar_t 表示扩展字符集, wchar_t 足够长表示扩展字符集
wcin
wcout
前缀L表示宽字符常量和宽字符串
C++11扩展
底层类型
char16_t : u 通用字符名\u
char32_t : U 通用字符名\U
bool类型
bool 只有 true 和 false
任何数字值或指针值都可以被隐式转换位bool, 无须强行转换
3.2 const 限定符
定义符号常量
比#define更好用的方法
const type name = value;
const int Months = 12;
应该在声明中进行初始化, 否则将无法修改
优点:
指明类型
限定作用域在函数或文件中
可以用于更复杂的类型中
3.3 浮点数
计算机将浮点数分成两部分储存, 一部分表示值, 另一部分用于对值进行放大缩小
例如
34.1245 0.341245(基准值) 10000(缩放因子)
缩放因子的作用是移动小数点的位置, 浮点因此得名
书写浮点数
小数点表示法
E表示法
浮点类型
float double long double
float : 至少32位 4字节 至少6位有效位
double : 至少48位 8字节 至少15位有效位
long double : 至少和double一样多 8字节
头文件中指明了限制
浮点常量
默认情况下,浮点常量都属于double类型
如果希望常量为float类型, 请使用f或F后缀
对于long double类型, 可使用l或L后缀
1.234f
1.45E20F
2.2L
2.32
浮点数的优缺点
1.可以表示整数之间的值
2.有缩放因子, 表示的范围更大
3.浮点运算比整数运算慢, 且精度降低
类型的分类
符号整型
无符号整型
C++11新增
浮点型
统称为算术类型
3.4 C++算数运算符
加、减、乘、除、求模, 都有两个操作数
算数符优先级和结合性
先乘除, 后加减, 可以用括号指定自己定义的优先级。附录D
算数运算符-->看优先级
操作数-->看结合性
当两个运算符没有作用到一个操作数上时, 优先级和结合性将失效
int dues = 20 * 5 + 24 * 6; // 先计算哪个乘法留给了实现
除法分支
除法两个操作数都为整数, 小数部分将会丢弃
除法两个操作数中有一个为浮点数, 结果为浮点数
运算符重载简介
求模运算符
类型转换
自动类型转换
将一种算数类型的值赋给另一个算术类型的值时
表达式中包含不同的类型时
将参数传递给函数时
进行类型转换时, 可能会出现数据丢失等问题, C++将这些处理留给实现, 意味着不同实现可能反应不同
C++11{}初始化
{}初始化不允许缩窄, 即变量的类型不可能无法表示赋给它的值。
表达式中的转换
整型提升
校验表
传递参数时的转换
通常由C++函数原型控制
C++将对char、short应用整形提升(unsigned、signed)
取消函数原型的控制时, 将float转换为double
强制类型转换
通用格式
(typename) value // 来自C
typename (value) // C++
C++引入了四个强制类型转换符, 15章将介绍
static_cast (value) // 将值从一种数据类型转换为另一种数据类型, 比传统更严格
C++11中的auto声明
auto的历史:第9章
让编译器能够根据初始值的类型推断变量的类型。
auto x = 10;
小心使用
auto x = 0.0;
double y = 0;
auto z = 0; // 如果向将值存在double类型中, 将会出现错误