항목 3 : 배열과 다형성은 같은 수준으로 놓고 볼 것이 아니다. 개념정리 다형성 : 기본 클래스 객체의 포인터나 참조자를 통해서 파생 클래스 객체를 조작 하는 성질 public 상속의 쓰임 중 함수의 인자값이 기본클래스의 포인터나 레퍼런스일때 파생클래스도 받을수 있도록 해준다. 이유 1. 파생 클래스의 객체의 크기와 기본 클래스의 객체의 크기가 다르기 때문에, 포인터 계산(배열이니까!)시 오류가 발생한다! 해결방법 1. 배열의 포인터 계산과 다형성의 포인터 계산은 서로 다르다는 차이점을 숙지해라. 개인적인 생각 1. 이제부터 슬슬 기본 지식이 있어야지만 이해 할수 있는 수준이 나온다. 2. 이 차이점을 안다면, 코딩할 때 주의를 할수 있을것 같다.
레퍼런스 검색 결과
항목 1 : 포인터와 참조자를 구분하자. 개념 정리 포인터(pointer)는 NULL 을 가질수 있다. 참조자(reference)는 NULL 을 가질수 없다. 그렇기 때문에 C++ 스펙에는 참조자는 선언과 동시에 정의해야 한다. 그리고 참조자는 초기에 참조하고 있는것만 참조 할수 있으며, 다른 객체로 바꿀수 없다. 이유 1. 더 효율적인 코딩이 가능해 진다. 해결 방법 1. 각각 어떨때 쓰는지 알아 두어야 한다. 포인터(pointer)는 가리키는 객체의 주소가 없을 때가 있거나, 하나의 포인터로 여러개의 객체를 가리킬 필요가 있을 때 참조자(reference)는 가리키는 객체의 주소가 시작부터 끝까지 있거나, 오직 한개의 객체만 가리킬 때 여기에 참조자(reference)를 쓸때가 한가지 더 있다. op..
항목 30. 접근하기 어려운 멤버에 대한 비상수 포인터나 레퍼런스를 리턴하는 멤버 함수 사용을 피해라 이유 1. private의 데이터를 포인터나 레퍼런스로 리턴은 정보은닉 자체를 파괴하는 행위이다. - 설계를 할때 성능에 중점을 둔다면 이런 경우가 생길수 있다고 필자는 설명한다. 해결방법 1. 우선 하지 말라; 2. 만약 할수밖에 없다면, 상수로써 전달한다. const 주의점 1. 만약 상수성을 제거해야지만 사용해되어야 한다면, 그 데이터를 사용 할때 데이터가 변경되지 않는다는 보장이 있어야 한다, 2008/06/28 03:25 추가 주의점 1번의 경우, 내부 데이터를 상수성이 있는 핸들로 받아놨는데, 만약, 그것이 함수에 들어 갈때, 상수성을 없에야만 한다면(간혹 이런 함수들이 있었다.), 그 함수 ..
항목 23. 객체 반환시 레퍼런스를 반환하지 않는다. 이유 1. 존재하지 않는 객체를 레퍼런스로 반환 되어, 런타임 중 오류가 일어 날수 있다. - 함수에서 생성한 객체를 반환하는 경우 주의점 1. 레퍼런스를 반환할지 객체를 복사하여 리턴할지는 고민된다면, 올바르게 동작하는것으로 리턴 해라. 2. 컴파일러 제공 회사가 가능한 비용이 적게 드는 방법을 발견하도록 맡겨 둘것 코드 최적화(RVO)를 컴파일러가 알아서 해주는 부분을 말하는것 같다 개인적인 생각 1. .. int 형 이하의 객체는 모두 값에 의한 전달을 하는게 속편하다. 2. 여전히 해결방법 1번을 잘 생각해 봐야 할것이다.
항목 22. 값에 의한 호출보다는 레퍼런스에 의한 호출을 선호한다. 이유 2008/06/06 23:27 수정 1. 효율성이 매우 떨어 진다. 2. 상속 받은 객체가 부모객체 메소드에 들어갈 경우, 값이 짤려버린다. 1. 파생 클래스의 객체를 값에 의한 복사를 이루어질 경우, 그 비용을 많이 지불하기 때문이다. 2. 또한 객체 복사는 슬라이싱 문제(slicing problem)가 파생 객체의 복사체에 일어 날수 있기 때문이다. 해결 방법 1. 레퍼런스로 전달 한다. 주의 사항 - 2008/06/06 23:27 수정 1. 레퍼런스를 사용할때는 모호성이 없는것을 보장해야만 한다. 2. int형 이하의 데이터이고, 복사본만 쓰면 되는 경우 call by value가 더 빠르고 더 효율적이다. 1. 레퍼런스를 사..
항목 12. 생성자에서 치환보다는 초기화를 사용한다. 이유. 2008/05/31 12:57 수정 1. const와 레퍼런스 멤버들을 초기화 할 수 없다, 1. const 멤버 객체와 와 레퍼런스 멤버 객체는 초기화 순간에만 초기화를 할수 있다. 2. 초기화 보다 연산이 한단계 더 많아 진다. 2. 대입연산자(치환)은 이미 초기화 순서를 지나친것이기 때문에 1단계 많은 연산을 하게 되는것이다. 참조 1 클래스의 생성은 이 두단계를 거친다. 첫번째. 데이터 멤버의 초기화 두번째. 호출된 생성자의 코드가 실행된다. 2. const와 레퍼런스는 항상 생성자 초기화에서만 할수 있다. 3. 클래스내부에선 정적상수만이 초기화 할수 있다 해결 방법 1. 대입연산자 보다는 멤버초기화 리스트 구역을 사용 한다. 주의점 1..
최근댓글