자기대입이 왜 위험한가? 같은 객체를 가리키는 참조자 두개(A 와 B)가 A = B 라고 해 놓고 delete B 라고 했을 때, A가 가르킨 객체는 이미 전기적 신호를 받고 날라간 상태이다. 그렇기 때문에, 같은 타입으로 만들어진 객체 여러 개를 참조자 혹은 포인터로 물어 놓고 동작하는 코드를 작성할 때는 같은 객체가 사용될 가능성을 고려하는 것이 일반적으로 바람직한 자세이다. 어떻게 이 위험으로부터 보호하겠는가? 참조자의 경우, 주소가 같기 때문에, 같은 주소인지 if문으로 비교하여, 같다면 하는일 없이 리턴을 하지만, 자기 대입이 일어날 경우는 적기 때문에, 모든 객체에 대해서 조사하는것은 효율이 낮다. 그렇기 때문에 우선 매개체를 복사한 후에, 복사된 매개체와 내자신과 바꾸는 방법을 많이 사용한다..
operator= 검색 결과
항목 17. operator=에서 재귀치환을 검사한다. 이유 1. 효율성 때문이다. - 같은 값이면 대입할 필요가 없다 2. 정확함을 때문이다. 항목11 참조 (동적메모리 할당시 기존의 값이 있다면 날리고 해야 한다, 무결성을 보증하기 위해서다) 해결 방법 포인터의 값을 체크 - 효율도 높고 확실하다. - 또한 포인터 안으로 들어가서 세밀체크도 가능하다. - 강추! 2008/06/01 19:52 수정 인자로 들어온 값을 그대로 복사하고, 교체한다.(copy and swap 기법) 주의 사항 1. 객체를 기본자료형처럼 만드는것은 까다로우니, 가능성을 항상 고려해라 개인적 생각 1. 해결 방법 으로 우선 체크한다. 2. 객체의 아이디가 있을경우 아이디로 체크한다.(아이디같은 개념의 데이터) 이렇게 두가지를 ..
항목 16. operator=에서 모든 데이터 멤버들로의 치환을 수행한다. 이유 1. 재정의했었다면, 클래스 업그레이드 후 값을 변경안하면 안들어 간다. 2. 상속 관계의 값이 operator=으로 정상적으로 들어가지 않는다. 해결 방법 1. 업그레이드 하면 주의깊게 다시 정의 할것 2008/06/01 19:52 수정 수정 2. 상속관계일때는 자식의 생성자의 초기화 값자체를 인자로써 부모클래스의 생성자를 호출하면 정상적으로 된다. 1. 포인터의 깊은 복사가 필요없다면, 오히려 정의하지 않는 편이 더 좋다.(일일이 변경하지 않아도 되니까!) 주의 사항 1. 1번이 주의 사항이다. 2008/06/01 19:52 수정 수정 1. 만약 정의해아만 한다면, 반드시 operator=을 상황에 맞게 정의해야 한다! ..
항목 15. operator= 이 *this에 대한 레퍼런스(reference)를 리턴(return)하도록 한다. 이유 1. 연속적인 치환을 할 수 없게 된다. 2. 클래스를 사용하는 코드에서의 묵시적인 타입 변환도 할수 없게 된다. 3. const 레퍼런스로 받은 객체를를 &로 넘겨주지 못하게 된다. 4. 1,2,3 통틀어 객체도 기본자료형과 동일한 취급을 위해서다. 예) a = b = c = z = 1; 을 연산할수 있다! 해결 방법 1. 객체의 대입연산시 operator=을 수정하게 된다면 *this로 반환하게 만든다. 주의 사항 1. 혹시 기교를 위하여 다른값으로 넘겨주길 원하는 순간부터가 주의 사항이다! 개인적인 생각, 이래나 저래나 operator= 은 left.operator=(right)으..
최근댓글