最常用方式是operator[]取str[0],性能最高但空串时未定义行为;at(0)带边界检查会抛异常;front()语义更清晰且适用于多种容器,三者均需手动判空。

用 operator[] 直接取索引 0 的字符最常用
只要字符串非空,str[0] 就能拿到第一个字符。这是最直观、开销最小的方式,底层就是指针偏移,没有函数调用开销。
但要注意:如果 str 是空字符串(str.empty() == true),访问 str[0] 是未定义行为——不会抛异常,但可能读到随机内存或崩溃。
- 适用于
std::string、std::string_view、C 风格字符串(const char*) - 返回类型是
char(对std::string)或char&(可修改) - 不检查边界,性能高,责任在程序员
用 at() 方法做带边界检查的访问
str.at(0) 和 operator[] 功能一样,但会检查索引是否越界。越界时抛出 std::out_of_range 异常,适合调试阶段或不确定字符串长度的场景。
代价是每次调用都有一次条件判断和可能的异常开销,生产环境高频调用需权衡。
- 只适用于
std::string和std::vector等支持at()的容器 - 空字符串下会抛出
std::out_of_range: basic_string::at: __n (which is 0) >= this->size() (which is 0) - 不能用于
const char*或std::string_view(后者无at())
用 front() 获取首字符(C++11 起)
str.front() 语义更明确,专为“取第一个元素”设计,比 [0] 更具可读性。它同样不检查空容器,空串调用会未定义行为。
和 operator[] 一样轻量,且对所有标准容器(std::string、std::vector、std::deque)都可用,一致性更好。
- 返回
char&(可修改);const对象上调用返回const char& - 不适用于 C 风格字符串(
const char*)或std::string_view(C++17 才给string_view加了front()) - 注意:C++11–C++14 中
std::string_view没有front(),别误用
处理空字符串时必须显式判断
没有任何一种“取首字符”的方式会自动帮你跳过空串问题。不加判断就用 [0]、at(0) 或 front(),程序行为就不可靠。
常见写法是先检查 !str.empty(),再安全访问。如果业务上空串允许默认值(比如返回 '\0' 或抛逻辑错误),得自己封装一层。
- 别依赖
str.c_str()[0]——空串时c_str()返回指向 '\0' 的指针,[0]是'\0',看似“安全”,但语义模糊,容易掩盖逻辑缺陷 - 用
std::string_view时尤其小心:sv.data()在空 view 下合法,但sv.front()在 C++17 前不存在 - 跨线程或异步场景中,字符串对象生命周期结束后再访问首字符,会导致悬垂引用——这比空串更难排查
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











