-
[뇌를 자극하는 STL C++] 01 예제 문제 풀이책 공부/C++ STL 2021. 8. 27. 19:15
Part 01
STL을 학습하기 전 꼭 알아야 할 C++ 문법
Chapter 01 연산자 오버로딩
! 이것만은 알고 갑시다.
1. 다음 이항 연산자 '+'가 호출하는 오버로딩 함수 두 개를 고르세요. ( ② , ③ )
Point p1, p2; p1 + p2;
① operator+(p2, p1);
② p1.operator+(p2);
③ operator+(p1, p2);
④ p2.operator(p1);
해설 :
연산자 오버로딩에는 두 가지 방법이 있습니다.
1. 멤버함수를 이용한 연산자 오버로딩 ( ② )
2. 전역함수를 이용한 연산자 오버로딩 ( ③ )
이 문제에서 물어보는 것은 두가지입니다.
첫째. 이 두 가지의 연산자 오버로딩을 알고 있는가?
둘째. 각각의 연산자 오버로딩의 주체와 인자의 순서가 어떻게 되는지 알고 있는가?
①은 인자의 순서가 잘못되어 있으며, ④은 주체와 인자의 순서가 바뀌어 있습니다.
2. 다음처럼 세 인자를 받는 () 연산자 오버로딩 함수 선언으로 맞는 것은? ( ④ )
func(10, 20, 30);
① void operator()(void);
② void operator()(int);
③ void operator()(int, int);
④ void operator()(int, int, int);
해설 :
함수처럼 동작하는 객체를 함수 객체라고 합니다.
함수 객체는 함수 호출 연산자 오버로딩(() 연산자)을 통해 만들 수 있습니다.
이때 반환 타입과 함수 인자의 타입 및 갯수가 일치해야 합니다.
이 문제에서 물어보는 것은 두가지 입니다.
1. 함수 호출 연산자 오버로딩을 알고 있는가?
2. 오버로딩시 인자의 갯수가 일치해야하는 사실을 알고 있는가?
문제에서 주어진 것처럼 3개의 인자를 받기 위해서 3개의 인자를 가진 함수 호출 연산자 오버로딩을 해주어야 합니다.
3. 다음 배열 클래스의 정수 원소를 참조하기 위한 [] 연산자 오버로딩 함수 선언으로 맞는 것은? ( ③ )
array[0];
① void operator[](int);
② int operator[]();
③ int operator[](int);
④ int operator[]();
해설 :
배열 인덱스 연산자 오버로딩([] 연산자)을 통해 배열 인덱스를 통해 원소를 참조 할 수 있습니다.
이때 반환 타입과 함수 인자의 타입 및 갯수가 일치해야 합니다.
이 문제에서 물어보는 것은 두가지 입니다.
1. 배열 인덱스 연산자 오버로딩을 알고 있는가?
2. 오버로딩시 인자의 타입과 반환 타입이 각각 일치해야하는 사실을 알고 있는가?
①은 인자의 타입은 맞지만 반환 타입이 잘못되었으며, ②과 ④은 번환 타입은 올바르지만 인자의 타입이 void로 잘못되었습니다. ②과 ④이 같은 답을 하고 있는데, 출제 의도에 "3. 인자의 위치를 올바르게 알고 있는가?"를 추가한다면 ④를 ④ int operator[int ](); 로 바꿀 수 있지 않을까 생각이 듭니다.
[4번, 5번]
4. 다음이 컴파일될 수 있게 최소한의 String 클래스를 작성하세요.
String s("Hello!"); const char* sz = s;
5. 다음이 컴파일될 수 있게 최소한의 String 클래스를 작성하세요.
const char* sz = "Hello!"; String s("Hi~!"); s = sz;
해설 :
사용자가 정의 할 수 있는 타입 변환은 두가지가 있습니다.
1. 생성자를 이용한 타입 변환
2. 타입 변환 연산자 오버로딩을 통한 타입 변환
4번 문제에서는 String -> const char* 의 형태로 변화하도록 하는 것이 포인트 입니다.
따라서 타입 변환 연산자 operator const char* ()를 오버로딩 해야합니다.
5번 문제에서는 const char* -> String 의 형태로 변화하도록 하는 것이 포인트 입니다.
생성자를 이용한 타입 변환 String(const char* input)을 이용해도 되지만 이는 얕은 복사이므로
깊은 복사를 할 수 있도록 대입 연산자를 오버로딩 하는 것이 좋습니다.
#include <iostream> using namespace std; class String { private: char* text; public: String(const char* input) { // 문자열의 끝 '\n'을 포함하기 위해 +1 // strlen() ; '\n' 앞 까지만 카운팅 text = new char[strlen(input) + 1]; strcpy_s(text, strlen(input) + 1, input); } // for problem_4 operator const char*() { return text; } // for problem_5 (깊은 복사) const String& operator=(const char* input) { delete[] text; text = new char[strlen(input) + 1]; strcpy_s(text, strlen(input) + 1, input); return *this; } }; void problem_4() { String s("Hello!"); const char* sz = s; // point! String -> const char* cout << "s : " << s << '\n'; cout << "sz : " << sz << '\n'; } void problem_5() { const char* sz = "Hello!"; String s("Hi~!"); s = sz; // point! const char* -> String cout << "s : " << s << '\n'; cout << "sz : " << sz << '\n'; } int main() { problem_4(); problem_5(); return 0; }
이 게시물은 '한빛미디어'의 책 "뇌를 자극하는 C++ STL"(공동환)의 연습문제에 대한 개인 풀이를 정리한 게시물입니다. 이제 STL을 공부하기 시작하는 사람이라면 이 책을 구매하셔서 읽어보시길 강력히 추천드립니다. STL의 내용뿐 아니라 C++을 바라보는 시각이 넓혀주는 책입니다.
참고 서적 : 뇌를 자극하는 C++ STL