1. 다음 이항 연산자 +가 호출하는 오버로딩 함수 두 개를 고르세요.
Point p1, p2;
p1+p2;
- operator+(p2,p1);
- p1.operator+(p2);
- operator+(p1,p2);
- p2.operator(p1);
답: 2,3
1번이 안되는 이유: 매개변수의 순서가 p2가 먼저오기 때문에 p2+p1에 대해서 가능하므로 X
4번 역시 this인 자기자신이 p2기 때문에 불가능
2. 다음 세 인자를 받는 () 연산자 오버로딩 함수 선언으로 맞는 것은?
func(10, 20, 30);
- void operator()(void);
- void operator()(int);
- void operator()(int, int);
- void operator()(int,int,int);
답: 4
이유: 오버로딩은 함수이름이 같지만 전달받는 매개변수에 따라 호출되는 함수가 달라질 수 있기때문에 전달할 값과 매개변수의 갯수가 일치해야한다.
3. 다음 배열 클래스의 정수 원소를 참조하기 위한 [ ] 연산자 오버로딩 함수 선언으로 맞는 것은?
array[0];
- void operator[](int);
- int operator[]();
- int operator[](int);
- int operator[]();
답: 3
이유: array[0]은 0을 인자로 받아 정수 원소를 반환해야함. 0도 정수이고 반환도 정수이기 때문에 3번이 되야함.
4. 다음이 컴파일 될 수 있게 최소한의 String 클래스를 작성하시오.
String s("Hello!");
const char* sz = s;
#include <iostream>
using namespace std;
4번
class 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의 값이 할당된다.
'C++ > STL' 카테고리의 다른 글
[STL] 함수 포인터의 종류 (0) | 2025.02.15 |
---|---|
[STL] 함수 포인터 선언과 사용 (0) | 2025.02.15 |
[STL] 클래스 타입 변환 연산자 오버로딩 (0) | 2025.02.09 |
[STL] 타입 변환 연산자 오버로딩 (0) | 2025.02.09 |
[STL] 스마트 포인터 (0) | 2025.02.09 |