ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 명품 C++ 7장 1번 2번 3번 4번
    C++ 2018. 11. 3. 13:02

    문제 1~4까지 사용될 Book 클래스는 다음과 같다.


    #include <iostream>
    #include <string>
    using namespace std;
    class Book {
        string title;
        int price, pages;
    public:
        Book(string title = "", int price = 0, int pages = 0) {
            this->title = title; this->price = price; this->pages = pages;
        }
        void show() {
            cout << title << ' ' << price << "원" << pages << " 페이지" << endl;
        }
        string getTitle() { return title; }
    };


    1. Book 객체에 대해 다음 연산을 하고자 한다.


    int main() {
        Book a("청춘", 20000, 300), b("미래", 30000, 500);
        a += 500; // 책 a의 가격 500원 증가
        b -= 500; // 책 b의 가격 500원 감소
        a.show();
        b.show();
    }


    1) +=,-= 연산자 함수를 Book 클래스의 멤버 함수로 구현하라.


    소스코드


    #include <iostream>
    #include <string>
    using namespace std;
    class Book {
        string title;
        int price, pages;
    public:
        Book(string title = "", int price = 0, int pages = 0) {
            this->title = title; this->price = price; this->pages = pages;
        }
        void show() {
            cout << title << ' ' << price << "원" << pages << " 페이지" << endl;
        }
        string getTitle() { return title; }
        Book& operator+=(int price);
        Book& operator-=(int price);
    };
    Book& Book::operator+=(int price) {
        this->price += price;
        return *this;
    }
    Book& Book::operator-=(int price) {
        this->price -= price;
        return *this;
    }
    int main() {
        Book a("청춘", 20000, 300), b("미래", 30000, 500);
        a += 500; // 책 a의 가격 500원 증가
        b -= 500; // 책 b의 가격 500원 감소
        a.show();
        b.show();
    }


    복사본을 리턴하지 않도록 객체의 참조를 리턴 시킵니다.


    2) +=, -= 연산자 함수를 Book 클래스 외부 함수로 구현하라.


    소스코드


    #include <iostream>
    #include <string>
    using namespace std;
    class Book {
        string title;
        int price, pages;
    public:
        Book(string title = "", int price = 0, int pages = 0) {
            this->title = title; this->price = price; this->pages = pages;
        }
        void show() {
            cout << title << ' ' << price << "원" << pages << " 페이지" << endl;
        }
        string getTitle() { return title; }
        friend Book operator+=(Book& op2, int price);
        friend Book operator-=(Book& op2, int price);
    };
    Book operator+=(Book& op2, int price) {
        op2.price += price;
        return op2;
    }
    Book operator-=(Book &op2,int price) {
        op2.price -= price;
        return op2;
    }
    int main() {
        Book a("청춘", 20000, 300), b("미래", 30000, 500);
        a += 500; // 책 a의 가격 500원 증가
        b -= 500; // 책 b의 가격 500원 감소
        a.show();
        b.show();
    }


    값이 변경되 객체를 리턴하기 위해 참조에 의한 호출을 사용합니다.


    실행결과



    2. Book 객체를 활용하는 사례이다.


    int main() {
        Book a("명품 C++", 30000, 500), b("고품 C++", 30000, 500);
        if (a == 30000) cout << "정가 30000원" << endl; // price 비교
        if (a == "명품 C++") cout << "명품 C++ 입니다." << endl; // 책 title 비교
        if (a == b)cout << "두 책이 같은 책입니다." << endl; // title, price, pages 모두 비교
    }


    1) 세 개의 == 연산자 함수를 가진 Book 클래스를 작성하라.


    소스코드


    #include <iostream>
    #include <string>
    using namespace std;
    class Book {
        string title;
        int price, pages;
    public:
        Book(string title = "", int price = 0, int pages = 0) {
            this->title = title; this->price = price; this->pages = pages;
        }
        void show() {
            cout << title << ' ' << price << "원" << pages << " 페이지" << endl;
        }
        string getTitle() { return title; }
        bool operator==(int price);
        bool operator==(string title);
        bool operator==(Book op2);
    };
    bool Book::operator==(int price) {
        if (this->price == price) return true;
        else return false;
    }
    bool Book::operator==(string title) {
        if (this->title == title) return true;
        else return false;
    }
    bool Book::operator==(Book op2) {
        if (this->price == op2.price&&this->title == op2.title&&this->pages == op2.pages) return true;
        else return false;
    }
    int main() {
        Book a("명품 C++", 30000, 500), b("고품 C++", 30000, 500);
        if (a == 30000) cout << "정가 30000원" << endl; // price 비교
        if (a == "명품 C++") cout << "명품 C++ 입니다." << endl; // 책 title 비교
        if (a == b)cout << "두 책이 같은 책입니다." << endl; // title, price, pages 모두 비교
    }


    비교 하는 연산자이기 때문에 bool을 리턴 타입으로 사용합니다.


    2) 세 개의 == 연산자를 프렌드 함수로 작성하라.


    소스코드


    #include <iostream>
    #include <string>
    using namespace std;
    class Book {
        string title;
        int price, pages;
    public:
        Book(string title = "", int price = 0, int pages = 0) {
            this->title = title; this->price = price; this->pages = pages;
        }
        void show() {
            cout << title << ' ' << price << "원" << pages << " 페이지" << endl;
        }
        string getTitle() { return title; }
        friend bool operator==(Book op1,int price);
        friend bool operator==(Book op1, string title);
        friend bool operator==(Book op1, Book op2);
    };
    bool operator==(Book op1, int price) {
        if (op1.price == price) return true;
        else return false;
    }
    bool operator==(Book op1, string title) {
        if (op1.title == title) return true;
        else return false;
    }
    bool operator==(Book op1, Book op2) {
        if (op1.price == op2.price&&op1.title == op2.title&&op1.pages == op2.pages) return true;
        else return false;
    }
    int main() {
        Book a("명품 C++", 30000, 500), b("고품 C++", 30000, 500);
        if (a == 30000) cout << "정가 30000원" << endl; // price 비교
        if (a == "명품 C++") cout << "명품 C++ 입니다." << endl; // 책 title 비교
        if (a == b)cout << "두 책이 같은 책입니다." << endl; // title, price, pages 모두 비교
    }


    외부함수로 연산자 중복을 이용할때는 객체도 같이 넘겨줘야합니다.


    실행결과



    3. 다음 연산을 통해 공짜 책인지 판별하도록 ! 연산자를 작성하라.


    int main() {
        Book book("벼룩시장", 0, 50); // 가격은 0
        if (!book) cout << "공짜다" << endl;
    }


    소스코드


    #include <iostream>
    #include <string>
    using namespace std;
    class Book {
        string title;
        int price, pages;
    public:
        Book(string title = "", int price = 0, int pages = 0) {
            this->title = title; this->price = price; this->pages = pages;
        }
        void show() {
            cout << title << ' ' << price << "원" << pages << " 페이지" << endl;
        }
        string getTitle() { return title; }
        bool operator!();
    };
    bool Book::operator!() {
        if (this->price == 0) return true;
        else return false;
    }
    int main() {
        Book book("벼룩시장", 0, 50); // 가격은 0
        if (!book) cout << "공짜다" << endl;
    }


    실행결과



    friend 를 사용한다면 객체를 넘겨줘야합니다.


    4. 다음 연산을 통해 책의 제목을 사전 순으로 비교하고자 한다. < 연산자를 작성하라.


    int main() {
        Book a("청춘", 20000, 300);
        string b;
        cout << "책 이름을 입력하세요>>";
        getline(cin, b); // 키보드로부터 문자열로 책 이름을 입력 받음
        if (b < a)
            cout << a.getTitle() << "이 " << b << "보다 뒤에 있구나!" << endl;
    }


    소스코드


    #include <iostream>
    #include <string>
    using namespace std;
    class Book {
        string title;
        int price, pages;
    public:
        Book(string title = "", int price = 0, int pages = 0) {
            this->title = title; this->price = price; this->pages = pages;
        }
        void show() {
            cout << title << ' ' << price << "원" << pages << " 페이지" << endl;
        }
        string getTitle() { return title; }
        friend bool operator<(Book op1, Book op2);
    };
    bool operator<(Book op1, Book op2) {
        if (op1.title < op2.title) return true;
        else return false;
    }
    int main() {
        Book a("청춘", 20000, 300);
        string b;
        cout << "책 이름을 입력하세요>>";
        getline(cin, b); // 키보드로부터 문자열로 책 이름을 입력 받음
        if (b < a)
            cout << a.getTitle() << "이 " << b << "보다 뒤에 있구나!" << endl;
    }


    실행결과



    friend 를 사용하지 않으려면 op1 을 빼면됩니다.

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

    명품 C++ 7장 6번  (0) 2018.11.03
    명품 C++ 7장 5번  (0) 2018.11.03
    명품 C++ 6장 Open Challenge  (0) 2018.11.02
    명품 C++ 6장 9번  (0) 2018.11.02
    명품 C++ 6장 8번  (2) 2018.11.02

    댓글

© 2018 TISTORY. All rights reserved.