[STL] 1장 문제풀이

1. 다음 이항 연산자 +가 호출하는 오버로딩 함수 두 개를 고르세요.
Point p1, p2;
p1+p2;
  1. operator+(p2,p1);
  2. p1.operator+(p2);
  3. operator+(p1,p2);
  4. p2.operator(p1);

답: 2,3

1번이 안되는 이유: 매개변수의 순서가 p2가 먼저오기 때문에 p2+p1에 대해서 가능하므로 X

4번 역시 this인 자기자신이 p2기 때문에 불가능

 

2. 다음 세 인자를 받는 () 연산자 오버로딩 함수 선언으로 맞는 것은?
func(10, 20, 30);
  1. void operator()(void);
  2. void operator()(int);
  3. void operator()(int, int);
  4. void operator()(int,int,int);

답: 4

이유: 오버로딩은 함수이름이 같지만 전달받는 매개변수에 따라 호출되는 함수가 달라질 수 있기때문에 전달할 값과 매개변수의 갯수가 일치해야한다.

 

3. 다음 배열 클래스의 정수 원소를 참조하기 위한 [ ] 연산자 오버로딩 함수 선언으로 맞는 것은?
array[0];
  1. void operator[](int);
  2. int operator[]();
  3. int operator[](int);
  4. int operator[]();

답: 3

이유: array[0]은 0을 인자로 받아 정수 원소를 반환해야함. 0도 정수이고 반환도 정수이기 때문에 3번이 되야함.

 

4. 다음이 컴파일 될 수 있게 최소한의 String 클래스를 작성하시오.
String s("Hello!");
const char* sz = s;
#include <iostream>
using namespace std;

4class String {
	char buf[100];

public:
	String(const char* chr) {
		strcpy_s(buf, strlen(chr)+1, chr);
	}

	operator const char* () {
		return buf;
	}
};

int main() {
	String s("Hello!");
	const char* sz = s;

	cout << sz;

	return 0;
}

 

1. String 클래스를 선언하고 매개변수를 char* 로 문자열로 받아와 char배열 buf에 복사한다. 이때 '\n' 삽입을 위해 +1 크기를 추가할당

 

2. String클래스를 char* 에 넣기위한 클래스 타입 변환 연산자 오버로딩으로 buf를 반환하게 한다. 그럼 buf에 있는 글자들이 sz로 들어가게된다. char형 포인터는 배열과 같기때문.

 

5. 다음이 컴파일 될 수 있게 최소한의 String 클래스를 작성하세요.
const char* ss = "Hello!";
String str("Hi~!");
str = ss;
class String {
	char* buf;

public:

	String(const char* chr) {
		buf = new char[strlen(chr) + 1]; //끝에 "\n" 삽입을 위해 1크기 더 할당
		strcpy_s(buf, strlen(chr) + 1, chr);
	}

	~String() {
		delete[] buf;
	}

	const String& operator=(const String& arg) { //char* ss에 넣기위한 대입연산자
		delete[] buf;
		buf = new char[strlen(arg.buf) + 1]; //끝에 "\n" 삽입을 위해 1크기 더 할당
		strcpy_s(buf, strlen(arg.buf)+1, arg.buf);

		return *this;
	}

	/*const String& operator=(const char* chr) {
		delete[] buf;
		buf = new char[strlen(chr) + 1];
		strcpy_s(buf, strlen(chr) + 1, chr);

		return *this;
	}*/
};

int main() {
	//5번
	const char* ss = "Hello!"; //String
	String str("Hi~!");
	str = ss;

	return 0;
}

 

1.  4번과 다르게 String클래스 속성을 char*형으로 하고 생성자를 통해 4번과 같이 할당해준다.

2. Str을 생성자를 통해 생성한다.

3. char* 형 ss를 String클래스에 할당하기 위해 대입연산자 오버로딩으로 혹시모를 buf의 메모리를 해제하고 받아온 arg의 크기+1 만큼 할당해주어 값을 복사하고 반환한다.

4. *깊은 복사가 이루어져 str에는 ss의 값이 할당된다.