class AAA
{
private:
int num;
public:
AAA() : num(0) {}
AAA& CreateInitObj(int n) const
{
AAA* ptr=new AAA(n);
return *ptr;
}
void ShowNum() const { cout<<num<<endl;}
private:
AAA(int n) : num(n) {}
};
int main(void)
{
AAA base;
base.ShowNum();
AAA &obj1=base.CreateInitObj(3);
obj1.ShowNum();
.
.
.
.
}
궁금한게 뭐냐면 진하게 칠한 부분에서 반환형이 참조자인데 이걸 참조자로 다시 참조한단 말이야. 이게 이해가 안돼
breakpoint 찍어서 ptr이 뭐가 반환되나 보니까 ptr은 주소값이고.. *ptr은 num=3이 있는데거든..
그럼 *ptr에서 참조형태로 반환하면 주소값이 가는걸까 싶어서 base.CreateInitObj(3)도 찍어봤어
근데 이건 *ptr처럼 num=3이 나오는거야.
그렇다면 참조형태로 반환한다는 의미는 뭘까?
이해가 안가서 두번째 진한 부분에서 &obj1을 obj1로 바꿔봤어. 근데도 잘 되더라구.
또 이상해서 반환형태를 그냥 객체로만 해봤어. AAA CreateInitObj(int n) 요렇게..그렇게 해도 잘되 ㅡㅡ;;
도대체 이것들 차이점이 뭐지?
한시간째 생각하고 있는데 정리가 안되서 프로그래밍 천재가 많다는 이곳에 왔어. 해결해줘 ㅜㅜ
ㅠㅠ...
CreateInitObj()의 ptr 이랑 main()의 &obj1를 비교해봅니다.. (객체 내부에 num말고 주소값..)
주소값은 다 같아. 그건 다 비교해봤지... 처음 이상했던건 참조자는 변수를 참조하는 건데 설마 주소값을 참조하나? 이거였어. 근데 이게 꼬이고 꼬이다 보니까 이젠 다 헷갈리네;;;
아 차이점은 참조형태로 반환하면 ptr이나 obj1이나 주소는 같아. 그런데 객체형태로 반환하면 ptr이랑 obj1이랑 주소가 다르다는 것.. 그렇다면 참조형태로 반환하는것에 중요한 포인트가 있는 것인데 그게 도대체 뭐지?
반환하는것의 형태와는 상관없이 이건 변수형태로 나온다는 것 같은데.. 이 변수의 주소를 반환하느냐 아니면 그 객체 자체만 반환하느냐의 차이일까? 그래서 &obj1으로 받던지 obj1으로 받던지 차이는 안보였던거고..
아 어지럽다..
-_- 저렇게 짜지 마라. 메모리 샌다
책에 예제로 있던거야.. 나 이해좀 시켜줘 ㅜㅜ 메모리가 샌다는 의미는 뭐야? 나중에 delete 해주면 괜찮은거 아닌가? 아 이 예제는 privat 생성자가 무엇인지 보여주느라고 나온 예제야
아 &obj1으로 받으면 반환한 변수를 참조하니까 같은 주소를 갖는거고..obj1으로 받으면 다른 주소에서 반환된 변수를 가리키는거겠지? 그럼 반환시 객체로 보내냐...참조형태로 보내냐..이게 문제인데 ㅡㅡ;;
책도 좀 좋은 걸 고르지 어디서 거지발싸개 같은 걸 구해서 --; 질문 좀 다시 올려봐바라 A vs B로
반환값이 포인터 타입이 아니면 보통은 delete 안하지. 누가 delete &a; 라는 식으로 해제하겠어?
진짜 예제가 좀 거지같긴 하다. 참조반환을 다시 참조하는게 두번참조하는게 아닌가 하는게 질문의 요지 같은데
참조자가 뭔지를 다시 생각해봅시다. 참조자란게 원래 있는 객체에 다른 이름을 붙이는거잖아? 참조자를 다시 참조하면 그 원래 있던 객체에 또 다른 이름을 붙이는거니까 결국 그냥 참조지
참조자 반환에 대해선 Effective C++ 항목 21을 참고
아...말그래도 그냥 참조자를 다시 참조했다고 생각하면 정신건강에 편한건가..-_-;;
지금 내 책은 윤성우 열혈강의 c++이야
그 책 버려요. 그리고 질문할 때 정리해서 올리셈 어떤 답변을 원하는 건지 캐치하기가 어려움
http://codepad.org/KZESaRk8
이 코드랑 똑같은거임. 아무리 그냥 예제라지만 저 예제는 좀 너무했다
그냥 객체로 반환하게 되면 반환되는 객체와 똑같이 생겨먹은 객체를 새로 생성 후 반환하게 됩니다. 한 번 클래스의 생성자나 소멸자에 출력문을 넣고 객체의 생성과 소멸을 관찰해보세요.
링크는 잘봤어..그건 내가 이해한거긴 했는데 저 코드로 나오니까 이해가 안간건가? 그럼 근본적인 질문할게 반환형을 참조형태로 한것과 객체로 한것과 차이가 뭐지? 그 자체만이 아니라.. 이걸 받아서 활용할 때 큰 차이가 있냐는거야
참조자를 리턴하는 건 그냥 포인터를 넘긴다고 생각하면 편함. 그 객체 자체가 아니라. 근데 객체 자체를 넘기는 건 말 그대로 객체 그대로를 통채로 반환 하는 거임.
http://codepad.org/sUxNwLVn
워닝이 뜨긴 하는데 그냥 코드만 한번 봐봐요. f1()은 당연히 이상한거라고 생각하는 사람들 중에 f2()가 이상한지는 모르는 사람이 많거든? 근데 둘다 똑같이 dangling reference를 반환한다는 점에서 똑같은겨.
그러면 객체로 반환할 경우에 기존에 있던 ptr의 주소정보는 잊어버리게 되고 delete 못시켜 주니까 낭비된다는건가?
ㅇㅇ 아까도 말했지만 delete &obj1; 이라고 강제로 변수의 주소를 삭제하는 방법이 있긴 한데 일반적으로 저렇게는 안쓰지. 힙에 생성된 객체인지 스택에 생성된 객체인지 파악하기가 힘든 것도 있고
kukyakya//위에 알려준거에서 질문할게 f2를 n으로 받는것과 &n으로 받는건 그럼 무슨차이일까? n으로 받으면 새로운 걸 만드는거고 &n으로 받으면 받은거에 새로운 이름 지어주는 거라고 봐야하나?
새로운 이름보다는 걍 참조자 이름 그대로 참조한다고 생각하셈. 근데 이미 저 상황에선 f2가 리턴할 때 참조되는 대상은 이미 소멸되어버림(메모리에는 남아있을 수 있지만)
그래서 어느 쪽이나 문제 있음.
음..이번 장 한번보고 다시 또 봐야겠네.. 아직 확실히 개념이 안잡혔나봐. 형들 고마워