C++ 초보자의 흔한 문제점 1


#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 |

태그: C++

6월 6일 01:18에 게시됨