基本数据类型:
目录 基本数据类型:
整数、浮点 、字符、空
插一个 之结构体与类的区别
整数类型:int, short, long, long long, char, unsigned int, unsigned short, unsigned long, unsigned long long, bool 等。
浮点数类型:float, double, long double 等。
字符类型:char, wchar_t, char16_t, char32_t 等。
空类型:void。
// 基本数据类型
int age = 25; //sizeof输出大小是4
double pi = 3.14159; //sizeof输出大小是8
char grade = 'A'; //sizeof输出大小是1
bool isStudent = true; //sizeof输出大小是1
// 数组
int numbers[5] = { 1, 2, 3, 4, 5 }; //sizeof输出大小是20
一些基本类型大小
在这之前我们来了解一下字节
一个字节(Byte)通常代表着0~255 由 0000 0000 ~ 1111 1111 可以表示256个数 占8位
整数类型:
int
: 通常为32位(取决于平台),用于存储带符号的整数。适用于大多数整数运算场景。 4字节short
: 通常为16位,用于存储带符号的短整数。适用于需要节省内存的场景。 2字节long
: 通常为32位或64位(取决于平台),用于存储带符号的长整数。适用于需要更大整数范围的场景。 8或4字节long long
: 通常为64位,用于存储更大范围的带符号整数。适用于需要非常大整数范围的场景。 8字节char
: 通常为8位,用于存储字符和小整数值(例如0到255)。字符型数据使用ASCII编码进行表示。 1字节unsigned int
: 通常为32位(取决于平台),用于存储无符号整数,不支持负数。适用于存储非负整数的场景。 4字节unsigned short
: 通常为16位,用于存储无符号短整数,不支持负数。适用于节省内存且存储非负整数的场景。 2字节unsigned long
: 通常为32位或64位(取决于平台),用于存储无符号长整数,不支持负数。适用于存储非负整数的场景。 4或8字节unsigned long long
: 通常为64位,用于存储更大范围的无符号整数,不支持负数。适用于存储非负整数的场景。 8字节bool
: 用于表示布尔值,取值为true
或false
。在条件判断和逻辑运算中经常使用。 1字节浮点数类型:
float
: 单精度浮点数,通常为32位。适用于单精度浮点数的运算和存储场景,精度约为6-9位小数。 4字节double
: 双精度浮点数,通常为64位。适用于双精度浮点数的运算和存储场景,精度约为15-18位小数。 8字节long double
: 扩展精度浮点数,通常为80位或128位。适用于需要更高精度计算的场景,但不同平台上可能有不同的实现。 10或16字节字符类型:
char
: 通常为8位,用于存储单个字符。常用于字符串操作和字符处理。 1字节wchar_t
: 宽字符类型,通常为16位或32位,用于存储Unicode字符。用于多语言和国际化支持。 2或4字节char16_t
: 16位字符类型,用于存储UTF-16编码的Unicode字符。用于Unicode字符处理。 2字节char32_t
: 32位字符类型,用于存储UTF-32编码的Unicode字符。用于Unicode字符处理。 4字节空类型:
void
: 表示空类型,不占用内存空间。主要用于函数返回类型或指针类型,不能用于定义变量。
这里呢我们还存在一些复杂结构的数据类型
复合数据类型:
数组:一组具有相同数据类型元素组成的集合。
结构体:由多个不同数据类型的成员组成的数据类型(在c++中可以包含成员方法)。
枚举:一种在编程中,我们将一组常量附上自己喜欢的自己方便理解名字的数据类型。每个枚举常量都被赋予一个整数值,这些整数值可以用来表示枚举常量在内存中的存储
联合体:可以有自己的数据成员和函数成员,并可以拥有构造函数和析构函数,但是联合体不支持继承和多态。(共享内存 所有成员共享一块内存 一旦附上新的值 就全部附上新的值)
类:类似于结构体,但允许包含方法(成员函数)存在构造析构函数能够实现继承多态。
数组
array:
一种顺序存储的数据结构,数组中的每个元素都有一个唯一的下标(索引),通过下标可以访问和操作数组中的元素。
声明以及初始化:
int myArray[5] = {1, 2, 3, 4, 5}; // 声明并初始化数组为 {1, 2, 3, 4, 5}
double doubleArray[3] = {1.1, 2.2, 3.3}; // 声明并初始化数组为 {1.1, 2.2, 3.3}
/*数组的下标访问是从0开始
数组的大小一旦确定,就不能再改变。需要确保数组大小足够存储所有元素,否则可能导致数组越界访问和内存溢出问题。
数组下标越界访问会导致未定义行为,可能会访问到未知的内存区域,引发程序崩溃或产生不可预测的结果。在编程时,务必保证数组下标在合法范围内。
*/
结构体
struct:(要注意在c++中不需要typedef定义)
//这里我用树的一个结点举例
struct BST{
int value;
BST* pleft;
BST* pright;
};
有关结构体对齐详解可以看这篇http://t.csdnimg.cn/vQXJi
枚举
#include <iostream>
using namespace std;
enum Weekday {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
};
enum Test {
};
int main() {
int array[5];
Weekday today = Monday;
Test Tom;
cout << array << endl;
cout << today << " " << sizeof(today) << " " <<&today << endl;
cout << Tom << " " << sizeof(Tom) << " " << &Tom << endl;
return 0;
}
输出:
我们可以发现这个没有指定常量的枚举采用是int 而且默认值是0
开始递增
直接输出空枚举得到的是垃圾值
一般来说,编译器会尽量选择能够容纳所有枚举常量值的最小的整数类型来表示枚举类型。这意味着如果枚举中的常量值都可以用 int
类型来表示,那么枚举的大小就是 sizeof(int)
。如果枚举的常量值不能都用 int
类型表示,编译器可能会选择更大的整数类型,例如 long
或 long long
当然我们可以定义时不采用默认递增值,如下:
enum Color {
Red = 10,
Green = 20,
Blue = 30
};
联合体
union MyUnion {
int intValue;
char charValue;
double doubleValue;
};
联合体的对齐方式和结构体类似,也需要考虑数据成员的大小和对齐边界。但是联合体与结构体不同的是所有成员共享同一块内存空间,即不同成员在内存中起始地址是相同的。因此,联合体的大小由其最大的成员决定,并且不需要额外的对齐填充。
类
class: 以下是一个 类 的定义
class AA
{
//在类中表明访问修饰符 不然默认权限是private(只能在本类内看到)
public:
int a;
protected:
int b;
private:
int c;
};
空类占一个字节,同时类也遵循结构内存对齐问题(和结构体类似),与结构体不同的是,类可能存在虚函数问题,产生虚函数指针,在计算对齐问题时不要忽略。
插一个 *******
这里我们就要提到经典问题之 --------------- 结构体和类的区别
这里我们延伸出两个问题 要想知道c++中结构体和类的区别 我们要先知道 在c到c++中 结构体加入了一些改动
默认访问权限:
类的成员默认是私有(private),即在类的外部无法直接访问类的私有成员,只能通过类的公有接口(公有成员函数)来访问。
结构体的成员默认是公共(public),即在结构体外部可以直接访问结构体的成员。
继承:
类可以使用 private、protected 或 public 关键字来指定派生类对基类成员的访问权限。
结构体默认使用 public 继承,意味着派生结构体继承了基础结构体的所有公共成员。
方法的默认访问权限:
类的成员函数默认是私有的,需要在类的内部定义并使用。
结构体中可以定义成员函数,并默认为公有,可以在结构体外部直接调用。
构造函数和析构函数:
类可以定义构造函数和析构函数,用于对象的初始化和清理。
结构体不能定义析构函数,因为结构体的成员默认是公有的,没有私有资源需要清理。
类对象的初始化:
类对象的初始化更灵活,可以通过构造函数来实现不同的初始化方式。
结构体对象的初始化可以通过成员列表初始化或者直接赋值。
类的用途:
类更常用于面向对象的编程,用于封装数据和方法,实现数据抽象和封装,支持继承和多态等特性。
结构体更常用于简单的数据结构表示,用于组织一组相关的数据。