-
명품 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