一文穷尽所有C++的数据类型

通过 typeid(v).name() 获取各类C++变量类型

前言

在 Python 中,想要获取变量类型通过 type() 来获取非常方便,打印也十分清晰。虽然 C++ 是显式定义变量,但是有时候我们想通过变量名来获取数据类型,就不如 Python 方便了。

在 C++ 中,想要通过变量名来获取数据类型,可以使用 typeid(var).name() 来获取,但是缺点是输出形式比较难以辨识。在这里,我们对 C++ 的所有数据类型进行一下总结,顺便也便于以后查阅。

需要注意的是,此函数需要 #include<typeinfo> ,并且不同的编译器下会有不同的显示,这里以 G++ 的编译结果为例。

运行结果

首先是运行结果:

整数

char 类型显示为:       c
short 类型显示为:      s
int 类型显示为:        i
long 类型显示为:       l
long long 类型显示为:  x

int8_t 类型显示为:     a
int16_t 类型显示为:    s
int32_t 类型显示为:    i
int64_t 类型显示为:    l

正整数

unsigned char 类型显示为:      h
unsigned short 类型显示为:     t
unsigned int 类型显示为:       j
unsigned long 类型显示为:      m
unsigned long long 类型显示为: y

uint8_t 类型显示为:    h
uint16_t 类型显示为:   t
uint32_t 类型显示为:   j
uint64_t 类型显示为:   m

浮点

float 类型显示为:      f
double 类型显示为:     d

数组(数组与长度有关)

char[] 类型显示为:     A1_c
short[] 类型显示为:    A2_s
int[] 类型显示为:      A3_i
long[] 类型显示为:     A4_l
long long[] 显示为:    A100_x
float[] 类型显示为:    A2_f
double[] 类型显示为:   A2_d
vector<int> 为:        St6vectorIiSaIiEE	// 注意这里的i
vector<double> 为:     St6vectorIdSaIdEE	// 注意这里的d
string 类型显示为:     NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

指针(前面加P)

int* 类型显示为:       Pi
double* 类型显示为:    Pd
double** 类型显示为:   PPd
指针数组 类型显示为:   A3_Pd	// double* v[3]
数组指针 类型显示为:   PA3_d	// double (*v)[3]
string* 类型显示为:    PNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
std::vector<double>* 为:       PSt6vectorIdSaIdEE
std::vector<string>* 为:       PSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE

自定义类型

struct 类型显示为:     8V_struct
struct 初始化后为:     8V_struct
class 类型显示为:      7V_class
object 类型显示为:     7V_class
function 类型显示为:   FvvE

代码

#include <iostream>
#include <typeinfo> 
#include <vector>
using namespace std;

class V_class{};
struct V_struct{};
void v_func(){}

int main()
{
    // 以下所有变量的测试通过括号括起来,定义的变量为局部变量,就可以重名了,省去了起名字的烦恼
    // 整数类别
    {
		char v(0);
		cout << "char 类型显示为:\t" << typeid(v).name() << endl;
	}

    {
		short v(0);
		cout << "short 类型显示为:\t" << typeid(v).name() << endl;
	}

	{
		int v(0);
		cout << "int 类型显示为:\t" << typeid(v).name() << endl;
	}

	{
		long v(0);
		cout << "long 类型显示为:\t" << typeid(v).name() << endl;
	}

    {
		long long v(0);
		cout << "long long 类型显示为:\t" << typeid(v).name() << endl;
	}

    cout << endl;

    {
		int8_t v(0);
		cout << "int8_t 类型显示为:\t" << typeid(v).name() << endl;
	}
	
	{
		int16_t v(0);
		cout << "int16_t 类型显示为:\t" << typeid(v).name() << endl;
	}

	{
		int32_t v(0);
		cout << "int32_t 类型显示为:\t" << typeid(v).name() << endl;
	}

	{
		int64_t v(0);
		cout << "int64_t 类型显示为:\t" << typeid(v).name() << endl;
	}    

    cout << endl;

    // 正整数类别
    {
		unsigned char v(0);
		cout << "unsigned char 类型显示为:\t" << typeid(v).name() << endl;
	}

    {
		unsigned short v(0);
		cout << "unsigned short 类型显示为:\t" << typeid(v).name() << endl;
	}

    {
		unsigned int v(0);
		cout << "unsigned int 类型显示为:\t" << typeid(v).name() << endl;
	}

    {
		unsigned long v(0);
		cout << "unsigned long 类型显示为:\t" << typeid(v).name() << endl;
	}

    {
		unsigned long long v(0);
		cout << "unsigned long long 类型显示为:\t" << typeid(v).name() << endl;
	}

    cout << endl;

    {
		uint8_t v(0);
		cout << "uint8_t 类型显示为:\t" << typeid(v).name() << endl;
	}
	
	{
		uint16_t v(0);
		cout << "uint16_t 类型显示为:\t" << typeid(v).name() << endl;
	}

	{
		uint32_t v(0);
		cout << "uint32_t 类型显示为:\t" << typeid(v).name() << endl;
	}

	{
		uint64_t v(0);
		cout << "uint64_t 类型显示为:\t" << typeid(v).name() << endl;
	}    

    cout << endl;

    // 浮点数类别
	{
		float v(0);
		cout << "float 类型显示为:\t" << typeid(v).name() << endl;
	}

	{
		double v(0);
		cout << "double 类型显示为:\t" << typeid(v).name() << endl;
	}

    cout << endl;

    // 数组类别
    {
		char v[] = {0};
		cout << "char[] 类型显示为:\t" << typeid(v).name() << endl;
	}

    {
		short v[] = {0,0};
		cout << "short[] 类型显示为:\t" << typeid(v).name() << endl;
	}

	{
		int v[] = {0,0,0};
		cout << "int[] 类型显示为:\t" << typeid(v).name() << endl;
	}

	{
		long v[] = {0,0,0,0};
		cout << "long[] 类型显示为:\t" << typeid(v).name() << endl;
	}

    {
		long long v[100] = {0};
		cout << "long long[] 显示为:\t" << typeid(v).name() << endl;
	}

    {
		float v[] = {0.0f,0.0f};
		cout << "float[] 类型显示为:\t" << typeid(v).name() << endl;
	}

    {
		double v[] = {0.0,0.0};
		cout << "double[] 类型显示为:\t" << typeid(v).name() << endl;
	}


    // 容器类别
    {
        vector<int> v(20,1);
        cout << "vector<int> 为:\t" << typeid(v).name() << endl;
    }

    {
        vector<double> v(20,1);
        cout << "vector<double> 为:\t" << typeid(v).name() << endl;
    }
  
    // 字符串类别
    {
		string v("hello");
		cout << "string 类型显示为:\t" << typeid(v).name() << endl;
        // 可以看到,显示的内容与长短无关
	}

    cout << endl;

    // 指针类别
    {
        int* v;
        cout << "int* 类型显示为:\t" << typeid(v).name() << endl;
    }

    {
        double* v;
        cout << "double* 类型显示为:\t" << typeid(v).name() << endl;
    }

    {
        double** v;
        cout << "double** 类型显示为:\t" << typeid(v).name() << endl;
    }

    {
        // 指针数组
        double* v[3];
        cout << "指针数组 类型显示为:\t" << typeid(v).name() << endl;
    }

    {
        // 数组指针
        double (*v)[3];
        cout << "数组指针 类型显示为:\t" << typeid(v).name() << endl;
    }

    {
        string* v;
        cout << "string* 类型显示为:\t" << typeid(v).name() << endl;
    }

    {
        vector<double>* v;
        cout << "vector<double>* 为:\t" << typeid(v).name() << endl;
    }

    {
        vector<string>* v;
        cout << "vector<string>* 为:\t" << typeid(v).name() << endl;
    }

    cout << endl;
    // 结构体类别
    {
        cout << "struct 类型显示为:\t" << typeid(V_struct).name() << endl;
    }

    // 结构体类别
    {
        V_struct v_struct;
        cout << "struct 初始化后为:\t" << typeid(v_struct).name() << endl;
    }

    // 类
    {
        cout << "class 类型显示为:\t" << typeid(V_class).name() << endl;
    }

    // 对象
    {
        V_class v_class;
        cout << "object 类型显示为:\t" << typeid(v_class).name() << endl;
    }

    // 函数类别
    {
        cout << "function 类型显示为:\t" << typeid(v_func).name() << endl;
    }

	return 0;
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值