다라다라V
article thumbnail
728x90
반응형

※ 이번 포스트부터 책의 저작권을 고려하여 문제는 제외하고 풀이만을 게시하도록 하겠습니다.

본 글은 "황기태"님의 [명품 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";
반응형
profile

다라다라V

@DaraDaraV

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!