#include <iostream>
#include <string>
using namespace std;
struct User {
int id;
string name;
double score1;
double score2;
double score3;
};
int main() {
User alice;
alice.id = 102;
alice.name = "Alice";
alice.score1 = 97.5;
alice.score2 = 98;
alice.score3 = 99;
cout << alice.id << endl;
cout << alice.name << endl;
cout << alice.score1 << endl;
cout << alice.score2 << endl;
cout << alice.score3 << endl;
return 0;
}
위 코드를 살펴보세요. 만약 오류가 있다면 지적해주세요.
당신이 제공한 코드는 C++ 초보자가 자주 mắc는 몇가지 핵심개념 혼란점을 드러내는 좋은 학습 사례입니다. 아래에서 각 코드의 문제를 차례대로 분석하고 그에 따른 상세한 설명을 제공합니다. 이 설명이 여러분이 더 명확한 이해를 갖도록 도와드리겠습니다.
1.
구조체 멤버 배열 문제
struct User {
int id;
char[] name; // 문제: 배열 크기 미지정
double score1;
double score2;
double score3;
};
개념: C++에서 배열은 크기를 지정해야 한다
- C++에서 배열은 고정 크기의 연속 메모리 블록입니다. 배열을 선언할 때 크기를 반드시 지정해야 합니다.
-
올바른 문법: char name[20]; // 최대 19개의 문자 저장
- char[] name;와 같은 미지정 배열 크기는 컴파일러가 크기를 알 수 없기 때문에 오류를 일으킵니다.
더 나은 대안: std::string 사용
- 가변 길이 문자열을 저장할 때는 C++ 표준 라이브러리의 std::string을 사용하는 것이 더 안전하고 편리합니다.
struct User {
int id;
string name;
// ...
};
2.
객체의 창조 방식 혼란: 스택 객체 vs 히어 객체
User alice = new User(); // 오류: 객체 대신 포인터 할당
개념: new 연산자는 포인터를 반환한다
- new User()는 히어 영역에서 메모리를 동적 할당하고 생성자를 호출한 후 포인터를 반환합니다.
- User alice는 스택 영역에서 객체를 직접 생성합니다.
- 포인터를 객체 변수에 할당하는 것은 불가능합니다.
올바른 방법:
1. 스택 객체 생성:
User alice;
alice.id = 102;
2. 히어 객체 생성:
User* alice = new User();
alice->id = 102;
delete alice;
3.
문자열 할당 오류: 배열 vs 문자열 리터럴
alice.name = "Alice"; // 오류: 배열에 문자열 리터럴 할당 금지
개념: 배열 이름은 변경할 수 없는 상수 참조자
- 배열 이름은 배열의 첫 번째 요소 주소를 가리키는 상수 참조자입니다. 따라서 직접 할당할 수 없습니다.
- 문자열 리터럴은 읽기 전용 영역에 있습니다.
올바른 방법:
1. strcpy 사용:
#include <cstring>
strcpy(alice.name, "Alice");
2. std::string 사용:
struct User {
int id;
string name;
// ...
};
User alice;
alice.name = "Alice";
4.
헤더 파일 누락 주의사항
- string 사용 시 #include <string> 필요
- strcpy 사용 시 #include <cstring> 필요
- cout 사용 시 #include <iostream> 필요
결론: 위 코드의 오류는 다음 핵심 C++ 개념에 해당합니다.
| 코드 오류 | 관련 개념 | 해결 방법 |
|---|---|---|
| char[] name; | 배열 크기 지정 필수 | char name[20]; 또는 std::string 사용 |
| User alice = new User(); | new는 포인터 반환 | User alice; 또는 User* alice = new User(); |
| alice.name = "Alice"; | 배열에 문자열 할당 금지 | strcpy() 사용 또는 std::string |