04/22/2020
C++内置类型
两大类:算数类型和空类型
算数类型
算数类型分为两类:整型和浮点型
整型有:
- 字符
- 布尔类型
- 整型(short, int, long…)
浮点型有: - float – 最小尺寸:6位
- double – 最小尺寸:10位
- long double – 最小尺寸:10位
C++标准规定的尺寸的最小值,但允许编译器赋予这些类型更大的尺寸。所以有时候int和long的尺寸可以相等。
unsigned 和signed
除了布尔型和扩展字符型之外,其他整型可以划分为unsigned和signed两种。
字面值常量
每一个字符值常量都对应一种数据类型,字符值常量的形式和值决定了它的数据类型。它们有整型和浮点型字面值,整型字面值有三种形式十进制,八进制和十六进制。浮点型的表现为小数点或科学计数法表示的指数,可以是E或者e标识。
字符和字符串字面值
字符串的类型实际上是由常量字符构成的数组;所以结尾一定有空字符’\0’;
'a'; //字符字面值
"a"; //字符串字面值,这个是数组,所以里面有两个字符‘a’和‘\0’
转义序列
C++基本:\n,\t,\r,\…
泛化的转义序列:
- \12 换行符
- \40 空格
- \0 空字符
- \115 字符M
C风格字符串和string
字符串字面值是C++由C继承而来,所以他的类型是const char[] 或者const char*,注意是const,字面值无法改变的。
string有一个构造函数是
//1.string s(const char*);
string str("hello world"); //接受一个字符串字面值
//2.相反,如果 string 要转换回去有一个函数c_str();
const char* cStyleArr = str.c_str(); //返回去也应该是const的,并且结尾以空字符结束。
//3. 但是因为const不能改值,所以需要进一步转换成char*
const char* a = "hello";
char* b = const_cast<char*>(a);
cout << b << " " << b[0]<<" " <<b[3] <<endll;//hello h \0
//注意这里可以访问,但是无法改写b里面的内容,例如
b[2] ='a';//未定义的行为!
//4. char* 转char[]
char arr[6]; //strlen(a) + 1,但是strlen是在运行中确认,现在arr需要一个常值
strncpy_s(arr,b,strlen(b)+1);
注意:其实混合使用C风格和string是很容易混淆的,个人喜欢string类比较容易。但是有些老的公司依然使用老版本C风格的,所以这一块也是需要了解的。
类型转换
C++通常不会直接将两个不同类型的值相加。
- 算术类型之间的隐式转换被设计的尽肯能避免损失进度
3 + 3.4;//int 3被提升为double类型,再相加等于6.4
int a = 3 + 3.4;//初始化对象类型无法改变,所以结果double转换为int。
- 大多数表达式中,比int小的整型值首先提升为较大的整数类型,比如short,char
- 条件中,非布尔值转换成布尔类型,比如0、nullptr 转成false,1是true
- 初始化过程,初始值转换成变量的类型
- 赋值语句,右侧运算对象转换成左侧运算对象
- 多种类型需要转换成同一种类型
- 函数调用时也会发生类型转换
其他隐式类型转换
- 数组转换成指针,指针指向数组的首元素
- 转换成布尔类型
- 转换成常量:将指向非常量的指针成指向相应的常量类型的指针,引用也可以。反之不允许。
- 类类型定义的转换
强调第三点,例子
int i =3;
const int& j = i;//转 const int的引用
const int* k = &i;//转const int的指针
int& r = j;//不可以
int* p = k;//不可以
显式转换
- static_cast: 不包含底层const,都可以使用static_cast
- const_cast: 只能改变运算对象的底层const
- reinterpret_cast: 通常为运算对象的位模式提供较低层次上的重新编译
通常来说显式转换用的很少,因为它们具有危险性。
C++ primer 中的2.1.3和3.5.4 有更多解释。
C++ primer 中4.11类型转换