프로그래밍 언어/열혈 C++
11-3 연산자 오버로딩2
당장하자
2022. 3. 18. 00:06
new 연산자 오버로딩
new 연산자가 하는 일은 다음과 같다.
1. 메모리 공간의 할당
2. 생성자의 호출
3. 할당하고자 하는 자료형에 맞게 반환된 주소 값의 형 변환
세 가지 작업중 프로그래머가 오버로딩할 수 있는 것은 2번 생성자의 호출뿐이다.
void * operator new(size_t size)
{
void * adr = new char[size];
// void * adr = malloc(size);
return adr;
}
컴파일러에 의해서 필요한 메모리 공간의 크기가 바이트 단위로 계산되어서 인자로 전달되기 때문에 크기가 1바이트인 char 단위로 메모리 공간을 할당해서 반환하였다.
delete 연산자 오버로딩
void operator delete(void * adr)
{
delete []adr;
}
delete ptr;
이 실행되면 컴파일러는 먼저 객체의 소멸자를 호출한다.
그 다음에 delete 함수에 주소 값을 전달한다.
#include <iostream>
using namespace std;
class Point
{
private:
int xpos, ypos;
public:
Point(int x=0, int y=0) : xpos(x), ypos(y) { }
friend ostream& operator<<(ostream& os, const Point& pos);
void * operator new (size_t size)
{
cout<<"operator new : "<<size<<endl;
void * adr=new char[size];
return adr;
}
void operator delete (void * adr)
{
cout<<"operator delete ()"<<endl;
delete []adr;
}
};
ostream& operator<<(ostream& os, const Point& pos)
{
os<<'['<<pos.xpos<<", "<<pos.ypos<<']'<<endl;
return os;
}
int main(void)
{
Point * ptr=new Point(3, 4);
cout<<*ptr;
delete ptr;
return 0;
}
위 코드를 보면 new 와 delete 연산자도 객체 내부에 선언된다.
그런데 new 연산자는 객체를 생성할때 사용하는 연산자인데 생성되지도 않은 객체내에서 호출되는게 말이 될까?
그에 대한 답은 "operator new는 static으로 선언된 함수여서 가능하다" 이다. (delete도 static으로 선언됨)
->, * 연산자
#include <iostream>
using namespace std;
class Number
{
private:
int num;
public:
Number(int n) : num(n) { }
void ShowData() { cout<<num<<endl; }
Number * operator->()
{
return this;
}
Number & operator*()
{
return *this;
}
};
int main(void)
{
Number num(20);
num.ShowData();
(*num)=30;
num->ShowData();
(*num).ShowData();
return 0;
}
마치 num이 포인트 변수인 것처럼 동작한다.