C++小细节1-内置类型

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
  • 初始化过程,初始值转换成变量的类型
  • 赋值语句,右侧运算对象转换成左侧运算对象
  • 多种类型需要转换成同一种类型
  • 函数调用时也会发生类型转换

其他隐式类型转换

  1. 数组转换成指针,指针指向数组的首元素
  2. 转换成布尔类型
  3. 转换成常量:将指向非常量的指针成指向相应的常量类型的指针,引用也可以。反之不允许。
  4. 类类型定义的转换

强调第三点,例子

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类型转换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值