ABOUT ME

-

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

    11. 책의 이름과 가격을 저장하는 다음 Book 클래스에 대해 물음에 답하여라.


    #include <iostream>
    using namespace std;
    #include <string>
    class Book {
        char *title; // 제목 문자열;
        int price; // 가격
    public:
        Book(const char* title, int price);
        ~Book();
        void set(char* title, int price);
        void show() { cout << title << ' ' << price << "원" << endl; }
    };


    1) Book 클래스의 생성자, 소멸자, set() 함수를 작성하라. set() 함수는 멤버 변수 title에 할당된 메모리가 있으면 먼저 반환한다. 그러고 나서 새로운 메모리를 할당받고 이곳에 매개 변수로 전달받은 책이름을 저장한다.


    Book::Book(const char* title, int price) {
        strcpy(this->title, title);
        this->price = price;
    }
    Book::~Book() {
        delete title;
    }
    void Book::set(char* title, int price) {
        if (this->title)
            delete title;
        int len = strlen(title);
        this->title = new char[len+1];
        strcpy(this->title, title);
    }


    2) 컴파일러가 삽입하는 디폴트 복사 생성자 코드는 무엇인가?


    Book::Book(const char* title,int price) { strcpy(this->title, title); this->price = price; }


    3) 디폴트 복사 생성자만 있을 때 아래 main() 함수는 실행 오류가 발생한다.


    int main() {
        Book cpp("명품c++", 10000);
        Book java = cpp; // 복사 생성자 호출됨
        java.set("명품자바", 12000);
        cpp.show();
        java.show();
    }


    실행 오류가 발생하지 않도록 깊은 복사 생성자를 작성하라.


    Book::Book(const char* title,int price) {
        int len = strlen(title);
        this->title = new char[len + 1];
        strcpy(this->title, title);
        this->price = price;
    }



    4) 문제 3)에서 실행 오류가 바생하는 원인은 Book 클래스에서 C-스트링(char* title) 방식으로 문자열을 다루었기 때문이다. 복사 생성자를 작성하지 말고 문자열을 string 클래스를 사용하여, 문제 3)의 실행 오류가 발생하지 않도록 Book 클래스를 수정하라. 이 문제를 풀고 나면 문자열을 다룰 때, string을 사용해야하는 이유를 명확히 알게 될 것이다.


    소스코드


    #include <iostream>
    using namespace std;
    #include <string>
    class Book {
        string title; // 제목 문자열;
        int price; // 가격
    public:
        Book(string title, int price);
        void set(string title, int price);
        void show() { cout << title << ' ' << price << "원" << endl; }
    };
    Book::Book(string title, int price) {
        this->title = title;
        this->price = price;
    }

    void Book::set(string title, int price) {
        this->title = title;
        this->price = price;
    }
    int main() {
        Book cpp("명품c++", 10000);
        Book java = cpp; // 복사 생성자 호출됨
        java.set("명품자바", 12000);
        cpp.show();
        java.show();
    }


    실행결과



    string 클래스를 사용하면 문자열을 다룰 때, 메모리를 할당 받을 필요가 없기 때문에 string 클래스를 사용하는 것이 더 좋습니다.

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

    명품 C++ 5장 Open Challenge  (0) 2018.10.31
    명품 C++ 5장 12번  (2) 2018.10.31
    명품 C++ 5장 10번  (0) 2018.10.31
    명품 C++ 5장 9번  (0) 2018.10.31
    명품 C++ 5장 8번  (0) 2018.10.31

    댓글

© 2018 TISTORY. All rights reserved.