※ 이번 포스트부터 책의 저작권을 고려하여 문제는 제외하고 풀이만을 게시하도록 하겠습니다.
본 글은 "황기태"님의 [명품 C++ Programming]의 연습 문제 답을 공유하고자 작성되었으며, 필자가 직접 문제를 풀며 작성한 것이기에 오류가 있을 수 있습니다. 댓글로 알려주시면 반영하도록 하겠습니다.
시리즈 보기
[C++] 명품 C++ Programming 1장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 1장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 2장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 2장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 3장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 4장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 4장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 5장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 6장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 7장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 8장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 8장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 9장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 9장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 10장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 10장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 11장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 11장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 12장 연습 문제 풀이 (이론 문제)
[C++] 명품 C++ Programming 12장 연습 문제 풀이 (실습 문제)
[C++] 명품 C++ Programming 13장 연습 문제 풀이 (이론 문제)
4.1 - 4.5
class Rect {
int width, height;
public:
Rect(int w, int h) { width = w; height = h; }
int getWidth() { return width; }
int getHeight() { return height; }
int getArea();
};
int Rect::getArea() {
return width * height;
}
💡
(1)
Rect *p;
(2)
p = &r
(3)
cout << "사각형의 폭은 " << p->getWidth() << "이고, 사각형의 높이는 " << p->getHeight() << "입니다.";
💡
(1)
q = new Rect(w, h);
(2)
cout << "사각형의 넓이는 " << q->getArea() << endl;
(3)
delete q;
💡
[정답] ①번
기본 생성자 Rect()가 없어 객체가 생성되지 못합니다.
💡
[정답] 다음과 같은 기본 생성자를 작성해야합니다.
Rect::Rect() { width = 1; height = 1; }
(162쪽) 객체 배열 선언문은 오직 매개 변수 없는 기본 생성자를 호출합니다. 문제의 코드는 기본 생성자가 없어 컴파일 오류가 발생한 것입니다.
💡
Rect r[5] = { Rect(), Rect(2, 3), Rect(3, 4), Rect(4, 5), Rect(5, 6) };
int sum = 0;
for (int i = 0; i < 5; i++) {
sum += r[i].getArea();
}
cout << "사각형의 면적 합은 " << sum << "입니다." << endl;
💡
[정답] ④번
(159쪽) 객체이름으로 멤버를 접근할 때는 점(.) 연산자를 이용합니다. 그러나 객체의 포인터로 멤버를 접근할 때는 -> 연산자를 사용합니다. c는 객체이므로 점 연산자를 통해 멤버에 접근해야합니다.
③번은 *연산자를 이용해 포인터가 가리키는 객체를 받아온 것이므로 점(.) 연산자를 이용할 수 있습니다.
💡
[정답] ④번
(171쪽) delete 연산자는 포인터 변수가 가리키는 메모리를 힙으로 반환합니다. delete 연산자로 배열을 동적 반환하려면 배열 포인터를 사용해야합니다.
💡
[정답]
기본생성자
기본생성자
기본생성자
소멸자
소멸자
소멸자
: main 함수에서 호출한 Palette 클래스는 Color 객체가 3개 있는 배열을 만듭니다. 객체의 배열이 만들어지면서 기본생성자가 3번 호출되고, Pallette 의 소멸자가 실행되면서 배열이 반환되어 소멸자가 3번 호출됩니다.
💡
[정답] ①번
💡
delete [] p;
(181쪽 ~ 182쪽) delete 연산자를 이용하여 동적으로 할당 받은 배열을 반환하는 형식은 다음과 같이 작성해야합니다.
💡
[정답] ③번
(188쪽) 멤버 함수라도 정적 멤버 함수는 this를 사용할 수 없습니다. 정적 멤버 함수는 객체가 생성되기 전에 호출될 수 있어 정적 멤버 함수가 실행되는 시점에서 현재 객체가 존재하지 않을 수도 있기 때문입니다.
💡
[정답] ③번
(187쪽) this는 객체 자신에 대한 포인터입니다. this는 멤버 변수의 이름과 동일한 이름으로 매개 변수 이름을 짓고자 하는 경우에 사용하므로 생성자에서 사용할 수 있습니다.
💡
class Location {
int width, height;
public:
Location() {
this->width = 0;
this->height = 0;
}
Location(int width, int height) {
this->width = width;
this->height = height;
}
void show();
};
void Location::show() {
cout << this->width << this->height << endl;
}
💡
[정답] 동적으로 할당받은 메모리의 주소를 잃어버려 힙에 반환할 수 없게 되면 메모리 누수가 발생합니다. 메모리 누수가 발생하면 실행중 메모리를 할당받을 수 없는 심각한 상황이 발생할 수 있습니다.
(185쪽) 힙(heap)은 프로그램 실행 중에 new를 이용하여 동적으로 할당받아 사용할 수 있는 메모리입니다. 할당 받은 후 필요 없게 된 메모리를 힙에 반환하지 않거나 코딩 잘못으로 메모리 누수가 생기면, 힙에 메모리가 부족하여 할당 받을 수 없게 되니 주의가 필요합니다.
💡
(1)
[정답] 메모리 누수가 발생합니다.
함수 f()에서 배열을 delete로 힙에 메모리를 반환하지 않아 new char[10] 개의 메모리 누수가 발생합니다. 수정한 코드는 다음과 같습니다.
void f() {
char* p = new char[10];
strcpy(p, "abc");
delete[] p;
}
(2)
[정답] 메모리 누수가 발생하지 않습니다.
(3)
[정답] 메모리 누수가 발생하지 않습니다.
(4)
[정답] 메모리 누수가 발생합니다.
for문 속 if 블럭이 수행되면 int 메모리를 접근할 수 없어 메모리 누수가 발생합니다. 수정한 코드는 다음과 같습니다.
void f() {
int* p;
for (int i = 0; i < 5; i++) {
p = new int;
cin >> *p;
if (*p % 2 == 1) {
delete p;
break;
}
delete p;
}
}
💡
[정답] ①번
(190쪽) string 클래스를 사용하기 위해서는 string 클래스를 불러오는 코드가 필요합니다.
#include <string>
💡
[정답]
string s1 = "123";
string s2 = "246";
int n = stoi(s1);
int m = stoi(s2);
cout << n + m;
(198쪽) 문자열을 숫자로 변환하는 전역함수 stoi()를 사용합니다.
💡
[정답] ③번
(190쪽) string 은 C++ 표준 라이브러리에서 제공하는 클래스로서 문자열을 객체로 다룹니다.
💡
[정답]
string a = "My name is Jane.";
char ch = a[2];
if (a == "My name is John") cout << "same";
a += "~~";
a[1] = "Y";
'대학교 > 명품 C++programming 문제' 카테고리의 다른 글
[C++] 명품 C++ Programming 5장 연습 문제 풀이 (이론 문제) (0) | 2022.11.13 |
---|---|
[C++] 명품 C++ Programming 4장 연습 문제 풀이 (실습 문제) (0) | 2022.11.11 |
[C++] 명품 C++ Programming 3장 연습 문제 풀이 (이론 문제) (0) | 2022.10.29 |
[C++] 명품 C++ Programming 2장 연습 문제 풀이 (실습 문제) (0) | 2022.10.28 |
[C++] 명품 C++ Programming 2장 연습 문제 풀이 (이론 문제) (0) | 2022.10.27 |