599 字
3 分钟
Modern C++ 入门 —— 数据类型之 基本类型
基本类型
当一门语言不谈类型时,你得小心,这大概率是动态语言。但显然,C++ 不是. (废话)
在 C++ 中,每个值都有其确切的数据类型。总的来说可以分为两类:基本内置类型(Fundamental Types)和复合类型(Compound Types)。基本类型往往是一个最小化原子类型,无法进一步解构,由以下组成:
-
数值类型:
- 有符号整数:
int8_t,int16_t,int32_t,int64_t,int128_t(部分编译器支持) - 无符号整数:
uint8_t,uint16_t,uint32_t,uint64_t,uint128_t - 浮点数:
float(单精度),double(双精度,默认),long double
注意: 对应 Rust 的
isize和usize,C++ 使用std::ptrdiff_t和std::size_t。它们的大小取决于目标平台的指针大小(32 位平台为 4 字节,64 位平台为 8 字节)。 - 有符号整数:
-
字符串视图:
std::string_view(对标 Rust 的&str,极其轻量,不拷贝字符串) -
布尔类型:
bool,包含true和false -
字符类型:
char:基础字符(通常是 ASCII)char8_t:UTF-8 字符 (C++20)char32_t:表示单个 Unicode 字符(4 字节),如'A','中','😻'
-
空类型:
void或std::monostate(常用于表示类似 Rust()的单元类型状态)
类型推导与标注
与 Python、JavaScript 等动态语言不同,C++ 是一门静态类型语言,编译器必须在编译期知道所有变量的类型。但这不意味着你需要为每个变量写下冗长的类型声明。
在 Modern C++ 中,编译器非常聪明,它能通过变量的初始值自动推导出类型。这就是 auto 关键字的魔力。然而,编译器也不是万能的,在某些模糊的上下文中,它需要你手动给出“类型标注”。
来看段代码:
import std;
auto main() { // 假设我们有一个解析字符串的函数 auto guess = std::format_as<int>("42");}在某些泛型场景下(比如从字符串解析数值),如果你不明确告诉编译器你想要什么类型,代码就无法通过编译:
$ g++ -std=c++23 main.cpperror: conversion from 'string' to 'undetermined type'|| auto guess = parse("42");| ^~~~~ 编译器无法推导 guess 的确切数值类型因此,我们需要提供给编译器更多的信息,通过显式的类型标注来破除歧义。在 Modern C++ 中,你有两种优雅的选择:
- 直接声明类型:
int32_t guess = ... - 在调用时指定模板参数:
auto guess = parse<int32_t>("42");
Modern C++ 入门 —— 数据类型之 基本类型
https://www.messiah.icu/posts/modern-cpp-data_type/