String literal là chuỗi ký tự trong dấu ngoặc kép "...". Kiểu phụ thuộc vào prefix.
Các loại String Literal
| Prefix | Kiểu | Mô tả | Ví dụ |
|---|---|---|---|
| (không) | const char[N] | Narrow string (ASCII/UTF-8) | "hello" |
L | const wchar_t[N] | Wide string | L"hello" |
u8 | const char8_t[N] (C++20) / const char[N] | UTF-8 encoded | u8"hello" |
u | const char16_t[N] | UTF-16 encoded | u"hello" |
U | const char32_t[N] | UTF-32 encoded | U"hello" |
R | Tương ứng | Raw string literal (không escape) | R"(path\to\file)" |
Ví dụ Wide String
#include <iostream>
#include <cwchar>
using namespace std;
int main() {
wchar_t s[] = L"hello world!";
wcout << L"The uppercase string: \"";
for (size_t i = 0; i < wcslen(s); i++) {
putwchar(towupper(s[i]));
}
wcout << L"\"" << endl;
return 0;
}
Kết quả
The uppercase string: "HELLO WORLD!"
Raw String Literal (C++11)
Không cần escape ký tự đặc biệt. Cú pháp: R"delimiter(text)delimiter"
// Thay vì: "C:\\Users\\Name\\file.txt"
auto path = R"(C:\Users\Name\file.txt)";
// JSON/XML/Regex dễ đọc
auto json = R"({
"name": "John",
"age": 30
})";
// Delimiter tùy chỉnh (khi text chứa )")
auto sql = R"SQL(SELECT * FROM table WHERE name = "O'Brien")SQL";
Lưu ý quan trọng
- String literal có static storage duration - tồn tại suốt chương trình
- Kiểu là const - không được sửa đổi (UB nếu sửa)
- String literal giống nhau có thể được merge (string pooling)
- C++11:
u8cho UTF-8, C++20:char8_ttype riêng std::stringconstructor copy từ literal
So sánh với char array
char arr[] = "hello"; // Array trên stack, có thể sửa, size = 6 char* ptr = "hello"; // Trỏ đến literal (read-only), DEPRECATED C++ const char* ptr2 = "hello"; // Đúng std::string s = "hello"; // Copy vào string object