그리고 다음은 이어서 설명한 대입 연산자의 대표적인 특성이다.
int main(void)
{
Point pos1(5, 7);
Point pos2=pos1; // 복사 생성자 호출
....
}
int main(void)
{
Point pos1(5, 7);
Point pos2(9, 10);
pos2 = pos1; // 대입 연산자
}
위에서 중여한 사실은 pos2도, 그리고 pos1도 이미 생성 및 초기화가 진행된 객체라는 사실이다. 즉 기존에 생성된 두 객체간의 대입연산 시에는 대입 연산자가 호출된다.
pos2.operator=(pos1);
문제점은 디폴트 복사 생성자의 문제점과 동일하다. “멤버가 객체일 경우, 같은 객체를 가르키고 소멸 할 경우 객체를 소멸, dangling pointer 발생”
Person& operator=(const Person& ref)
{
delete []name;
int len = strlen(ref.name) + 1;
name = new char[len];
strcpy(name, ref.name);
age = ref.age;
return *this;
}
유도 클래스의 대입연산자에는 아무런 명시를 하지 않으면, 기초 클래스의 대입 연산자가 호출되지 않는다.
int main(void)
{
Second ssrc(111, 222, 333, 444);
Second scpy(0, 0, 0, 0);
scpy=ssrc;
scpy.ShowData();
return 0;
}
//아래는 showData의 결과이다. 디폴트 복사 할당 연산자
//First& operator=()
//111, 222
//333, 444
//오버로딩
//Second& operator=()
//0, 0
//333, 444
위의 실행결과는 유도 클래스에 삽입된 디폴트 대입연산자가 기초 클래스의 대입연산자까지 호출한다는 사실을 우리에게 알려준다.
“유도 클래스의 대입 연산자 정의에서, 명시적으로 기초 클래스의 대입 연산자 호출문을 삽입하지 않으면, 기초 클래스의 대입 연산자는 호출되지 않아서, 기초 클래스의 멤버변수는 멤버 대 멤버의 복사 대상에서 제외된다.