[C++] string 초기화 및 생성자
2025. 8. 9. 08:40
1. 기본 생성자 (빈 문자열)
#include <string>
#include <iostream>
using namespace std;
int main() {
string s1; // 빈 문자열
cout << "s1: \"" << s1 << "\"\n";
}
그냥 string s1; 이런식으로 선언할 경우,
내용이 없는 빈 문자열로 초기화됩니다. 내부적으로 ""와 동일합니다.
출력화면:
| s1: "" |
2. 기본 생성자 (멤버변수로서 string을 가지는 경우)
#include <string>
#include <iostream>
using namespace std;
class M {
public:
string s2;
};
int main() {
M a;
cout << "a.s2: " << a.s2 << endl;
if (a.s2.empty()) {
cout << "a.s2 is empty" << endl;
}
}
출력화면:
| a.s2: a.s2 is empty |
3. C-문자열로 초기화
- const char* 타입 문자열 리터럴로 초기화.
string s2 = "Hello"; // 복사 초기화 (Copy initialization)
string s3("Hello"); // 직접 초기화 (Direct initialization)
"Hello"는 C 스타일 문자열이지만, std::string 생성자가 자동 변환합니다.
위 두 코드는 C++11 이후 대부분의 경우 차이가 없습니다. (컴파일러 최적화로 동일 코드 생성).
4. 다른 std::string으로 초기화 (복사 생성)
기존 string의 문자열 내용을 그대로 복사합니다.
string original = "World";
string copy1(original); // 복사 생성자
string copy2 = original; // 복사 대입
5. 부분 문자열로 초기화
(원본문자열, 시작위치[, 길이]) 형태로 부분 문자열을 초기화할 수 있다.
string text = "Hello World";
string sub(text, 6); // "World" (6번째 인덱스부터 끝까지)
string sub2(text, 0, 5); // "Hello" (0부터 5글자)
6. 반복 문자로 초기화
(반복횟수, 문자) 형태로 문자열을 초기화한다.
string s4(5, 'A'); // "AAAAA"
7. char* + 길이로 초기화
C 문자열의 일부만 가져올 때 유용합니다.
const char* arr = "HelloWorld";
string s5(arr, 5); // "Hello" (앞에서 5글자만)
8. std::string + 이터레이터로 초기화
임의 범위를 잘라서 초기화할 수 있습니다.
STL 컨테이너 간에도 활용 가능.
string source = "ABCDEFG";
string s6(source.begin() + 2, source.begin() + 5); // "CDE"
9. std::move를 사용한 이동 초기화
복사 대신 메모리를 이동시켜 성능을 높일 때 사용.
string temp = "Temporary";
string moved(std::move(temp)); // temp는 비워지고, moved가 내용 가져감
10. std::to_string 사용 (숫자 → 문자열 변환)
숫자 → 문자열 변환 시 유용.
int num = 42;
string s7 = to_string(num); // "42"
11. 동적 char 배열을 string으로 초기화방법
std::string은 내부적으로 동적 메모리를 관리하므로, char*처럼 직접 메모리 해제를 할 필요가 없습니다.
복사 초기화(=)와 직접 초기화(())는 성능 면에서 거의 동일하나, 일부 경우 explicit 생성자 차이로 동작이 다를 수 있습니다.
중요: std::string은 인자로 받은 char* 내용을 복사합니다.
→ 따라서 원본 char*는 나중에 delete[]로 안전하게 해제해도 됩니다.
(char 배열은 delete 꼭 해주어야함)
#include <iostream>
#include <string>
using namespace std;
int main() {
char* dyn = new char[6]; // 동적 char 배열
dyn[0] = 'H';
dyn[1] = 'e';
dyn[2] = 'l';
dyn[3] = 'l';
dyn[4] = 'o';
dyn[5] = '\0'; // 문자열 끝 표시(널 문자)
string s1(dyn); // 직접 초기화
string s2 = dyn; // 복사 초기화
cout << s1 << endl;
delete[] dyn; // 메모리 해제 (string이 복사본을 가지고 있으므로 안전)
}
12. char* 배열을 string 배열에 초기화방법
(char 배열은 delete 꼭 해주어야함)
#include <iostream>
#include <string>
#include <vector>
int main() {
// 1. 동적으로 할당된 char 배열
const int num_strings = 3;
const int max_len = 20;
// char 배열을 동적으로 할당하고 값 설정
char** dynamic_char_array = new char*[num_strings];
dynamic_char_array[0] = new char[max_len];
dynamic_char_array[1] = new char[max_len];
dynamic_char_array[2] = new char[max_len];
strcpy(dynamic_char_array[0], "Hello");
strcpy(dynamic_char_array[1], "World");
strcpy(dynamic_char_array[2], "C++");
// 2. std::string 배열 초기화
// std::vector<std::string>을 사용하는 것이 더 효율적입니다.
std::vector<std::string> string_vector(num_strings);
for (int i = 0; i < num_strings; ++i) {
string_vector[i] = std::string(dynamic_char_array[i]);
}
// 결과 출력
for (const auto& s : string_vector) {
std::cout << s << std::endl;
}
// 3. 메모리 해제
for (int i = 0; i < num_strings; ++i) {
delete[] dynamic_char_array[i];
}
delete[] dynamic_char_array;
return 0;
}
13. 길이 지정해서 초기화
동적 배열이 널 문자로 끝나지 않았거나, 특정 길이만 쓰고 싶을 때:
char* dyn = new char[10]{'H','e','l','l','o'}; // '\0' 없음
string s3(dyn, 5); // 앞 5글자만 사용'C++ > C++' 카테고리의 다른 글
| [C++] unordered_map (0) | 2025.12.22 |
|---|---|
| (수정중) [C++] string 그리고 & (3) | 2025.08.09 |
| [C/C++] SIGSEGV, SIGABRT 등 시그널(Signal) 에러에 관한 고찰 (0) | 2025.06.04 |
| [C/C++] Signal(시그널) 종류 및 설명 (0) | 2025.06.04 |
| [C++] 가변인자를 다른 함수로 바로(by pass) 전달하는 방법 (0) | 2025.05.09 |
