ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 명품 C++ 5장 12번
    C++ 2018. 10. 31. 20:52

    12. 다음은 학과를 나타내는 Dept 클래스와 이를 활용하는 main()을 보여 준다.


    class Dept {
        int size; // scores 배열의 크기
        int* scores; // 동적 할당 받을 정수 배열의 주소
    public:
        Dept(int size) { //생성자
            this->size = size;
            scores = new int[size];
        }
        Dept(Dept& dept); // 복사 생성자
        ~Dept();
        int getSize() { return size; }
        void read(); // size 만큼 키보드에서 정수를 읽어 scores 배열에 저장
        bool isOver60(int index); // index의 학생의 성적이 60보다 크면 true 리턴
    };
    int countPass(Dept dept) { // dept 학과에 60점 이상으로 통과하는 학생의 수 리턴
        int count = 0;
        for (int i = 0; i < dept.getSize(); ++i) {
            if (dept.isOver60(i)) count++;
        }
        return count;
    }
    int main() {
        Dept com(10); // 총 10명이 있는 학과 com
        com.read(); // 총 10명의 학생들의 성적을 키보드로부터 읽어 scores 배열에 저장
        int n = countPass(com); // com 학과에 60점 이상으로 통과한 학생의 수를 리턴
        cout << "60점 이상은 " << n << "명";
    }


    1) main()의 실행 결과가 다음과 같이 되도록 Dept 클래스에 멤버들을 모두 구현하고, 전체 프로그램을 완성하라.


    Dept::Dept(Dept& dept) {
        this->size = dept.size;
        this->scores = new int[dept.size];
        for (int i = 0; i < dept.size; ++i)
            this->scores[i] = dept.scores[i];
    }
    Dept::~Dept() {
        delete[] scores;
    }
    void Dept::read() {
        cout << size<<"개 점수 입력>>";
        for (int i = 0; i < size; ++i) {
            int n;
            cin >> n;
            scores[i] = n;
        }
    }
    bool Dept::isOver60(int index) {
        if (scores[index] > 60) return true;
        else false;
    }


    2) Dept 클래스에 복사 생성자(Dept(Dept& dept);가 작성되어 있지 않는 경우, 컴파일은 되지만 프로그램 실행 끝에 실행 시간 오류가 발생한다(복사 생성자를 뺀채 실행해보라). 위의 코드 어느 부분이 실행될 때 복사 생성자가 호출되는지 설명하고, 복사 생성자가 없으면 왜 실행 오류가 발생하는지 설명하라.




    int n = countPass(com);


    에서 호출된다.


    1. 객체로 초기화하여 객체가 생성될 때 2. 값에 의한 호출로 객체가 전달될 때 3. 함수가 객체를 리턴할 때 묵시적 복사 생성에 의해 복사 생성자가 자동으로 호출된다. 컴파일러는 얕은 복사를 하는 복사 생성자가 디폴트 복사 생성자이기 때문에 동적 메모리를 할당받은 멤버가 있으면 에러가 난다.


    3) Dept 클래스에 복사 생성자를 제거하라. 복사 생성자가 없는 상황에서도 실행 오류가 발생하지 않게 하려면 어느 부분을 수정하면 될까? 극히 일부분의 수정으로 해결된다. 코드를 수정해보라.


    소스코드


    #include <iostream>
    using namespace std;
    class Dept {
        int size; // scores 배열의 크기
        int* scores; // 동적 할당 받을 정수 배열의 주소
    public:
        Dept(int size) { //생성자
            this->size = size;
            scores = new int[size];
        }
        ~Dept();
        int getSize() { return size; }
        void read(); // size 만큼 키보드에서 정수를 읽어 scores 배열에 저장
        bool isOver60(int index); // index의 학생의 성적이 60보다 크면 true 리턴
    };
    Dept::~Dept() {
        delete[] scores;
    }
    void Dept::read() {
        cout << size<<"개 점수 입력>>";
        for (int i = 0; i < size; ++i) {
            int n;
            cin >> n;
            scores[i] = n;
        }
    }
    bool Dept::isOver60(int index) {
        if (scores[index] > 60) return true;
        else false;
    }
    int countPass(Dept& dept) { // dept 학과에 60점 이상으로 통과하는 학생의 수 리턴
        int count = 0;
        for (int i = 0; i < dept.getSize(); ++i) {
            if (dept.isOver60(i)) count++;
        }
        return count;
    }
    int main() {
        Dept com(10); // 총 10명이 있는 학과 com
        com.read(); // 총 10명의 학생들의 성적을 키보드로부터 읽어 scores 배열에 저장
        int n = countPass(com); // com 학과에 60점 이상으로 통과한 학생의 수를 리턴
        cout << "60점 이상은 " << n << "명";
    }


    실행결과



    값에 의한 호출로 복사생성자가 자동으로 호출되기 때문에, countPass 함수를 참조에 의한 호출로 바꾸면 됩니다.


    'C++' 카테고리의 다른 글

    명품 C++ 6장 1번  (0) 2018.11.02
    명품 C++ 5장 Open Challenge  (0) 2018.10.31
    명품 C++ 5장 11번  (0) 2018.10.31
    명품 C++ 5장 10번  (0) 2018.10.31
    명품 C++ 5장 9번  (0) 2018.10.31

    댓글

© 2018 TISTORY. All rights reserved.