C++重新入门-C++数据类型
目录
1.基本的内置类型
2.typedef 声明
3.枚举类型
4.类型转换
使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。
您可能需要存储各种数据类型(比如字符型、宽字符型、整型、浮点型、双浮点型、布尔型等)的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么。
1.基本的内置类型
下表显示了各种变量类型在内存中存储值时需要占用的内存,以及该类型的变量所能存储的最大值和最小值。
注意:不同系统会有所差异,一字节为 8 位。
注意:默认情况下,int、short、long都是带符号的,即 signed。
注意:long int 8 个字节,int 都是 4 个字节,早期的 C 编译器定义了 long int 占用 4 个字节,int 占用 2 个字节,新版的 C/C++ 标准兼容了早期的这一设定。
2.typedef 声明
typedef
是 C++ 中用于为已有类型创建新名称的关键字。它的主要目的是为了提高代码的可读性和灵活性,尤其是在处理复杂的类型声明时。
typedef
的一般语法形式如下:
typedef existing_type new_type_name;
这里的 existing_type
是已有的数据类型,而 new_type_name
是你为这个数据类型定义的新名称。
在现代 C++ 中,推荐使用 using
关键字来实现类型别名,因为它提供了更多的功能。例如:
using IntPointer = int*;
using Person = struct {
int age;
char gender;
};
这两种形式在实质上是等效的。
3.枚举类型
在C++中,枚举类型是一种用户自定义的数据类型,用于表示一组具名的整数常量。它可以提高代码的可读性,使得变量只能取枚举中列举的值之一。
枚举类型的一般形式如下:
enum 枚举名 {
标识符[=整型常数],
标识符[=整型常数],
// ...
标识符[=整型常数]
} 枚举变量;
如果省略 "=整型常数" 部分,枚举成员的值默认从0开始,每个成员的值比前一个成员的值大1。如果为枚举成员赋予了初始值,后续的成员值将在前一个成员的基础上递增。
例如:
enum color { red, green, blue } c;
c = blue;
// 默认情况下,red的值为0,green的值为1,blue的值为2
enum color { red, green=5, blue };
// red的值为0,green的值为5,blue的值为6
这使得在编程中,你可以使用更有意义的标识符而不是硬编码的整数值,提高了代码的可读性和维护性。
4.类型转换
类型转换是将一个数据类型的值转换为另一种数据类型的值。
C++ 中有四种类型转换:静态转换、动态转换、常量转换和重新解释转换。
静态转换(Static Cast): 这是最基本的转换,用于在编译时进行类型转换。它主要用于较为明显的转换,例如数值类型之间的转换,但不提供运行时的安全性检查。
double myDouble = 3.14;
int myInt = static_cast<int>(myDouble);
动态转换(Dynamic Cast): 主要用于处理继承关系中的类型转换。它在运行时检查类型信息,提供了安全性检查,但仅在多态类型中才有意义。
class Base {
// ...
};
class Derived : public Base {
// ...
};
Base* basePtr = new Derived;
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
常量转换(Const Cast): 主要用于添加或移除变量的 const
修饰符。这种转换主要用于处理 const 修饰符的问题,但使用时需要谨慎,避免破坏数据的常量性。
const int i = 10;
int& r = const_cast<int&>(i); // 常量转换,将const int转换为int
重新解释转换(Reinterpret Cast): 这是最危险的类型转换,它通常用于不同类型之间的低级别位模式操作。它会忽略类型之间的任何关系,慎用。
int myInt = 42;
double* doublePtr = reinterpret_cast<double*>(&myInt);
所以以后转换类型需谨慎。最好不要不管三七二十一就用 a=(int)b;这种强制转换啦!