대입 연산자의 오버로딩2
Programming/C++ 2012. 9. 10. 21:05 |대입 연산자의 오버로딩은 클래스 정의에 있어서 생성자, 복사 생성자와 함께 빠질 수 없는 요소이다.
#include <iostream>
using namespace std;
class First
{
private:
int num1, num2;
public:
First(int n1=0, int n2=0)
:num1(n1), num2(n2)
{ }
void ShowData()
{
cout<<num1<<", "<<num2<<endl;
}
};
class Second
{
private:
int num3, num4;
public:
Second(int n3=0, int n4=0)
:num3(n3), num4(n4)
{ }
void ShowData()
{
cout<<num3<<", "<<num4<<endl;
}
Second& operator=(const Second& ref) //반환형이 참조형임을 주목!!
{
cout<<"Second& operator=()"<<endl;
num3 = ref.num3;
num4 = ref.num4;
return *this;
}
};
int main(void)
{
First fsrc(111, 222);
First fcpy;
Second ssrc(333, 444);
Second scpy;
fcpy = fsrc; //fcpy.operator=(fsrc);
scpy = ssrc;
fcpy.ShowData();
scpy.ShowData();
///////////////////////
First fob1, fob2;
Second sob1, sob2;
fob1 = fob2 = fsrc;
sob1 = sob2 = ssrc; //반환형이 참조형이므로 이런식의 연산이 가능하다.
fob1.ShowData();
fob2.ShowData();
sob1.ShowData();
sob2.ShowData();
return 0;
}
First 클래스에 자동으로 삽입된 디폴트 대입 연산자는 다음과 같다.
First& operator=(const First& ref)
{
num1=ref.num1;
num2=ref.num2;
return *this;
}
※ 멤버 대 멤버의 복사가 이뤄지는 것을 보면서, C언어의 구조체 변수간 대입연산의 결과와 비슷하다고 생각하기 쉽다.
그러나 앞서 보였듯이, 객체간의 대입연산은 C언어의 구조체 변수간의 대입연산과 본질적으로 다르다.
이는 단순한 대입연산이 아닌, 대입 연산자를 오버로딩 한 함수의 호출이기 때문이다.
'Programming > C++' 카테고리의 다른 글
상속 구조에서의 대입 연산자 호출 (0) | 2012.09.13 |
---|---|
디폴트 대입 연산자의 문제점 (0) | 2012.09.11 |
cout, cin 그리고 endl의 정체 (0) | 2012.08.30 |
교환법칙 문제의 해결 (0) | 2012.08.28 |
전위증가와 후위증가의 구분 (0) | 2012.08.27 |