[c++] 클래스 생성자에서 포인터 멤버 변수의 NULL 초기화는 어떻게 해야 하나요?
글쓴이: vudghkzm / 작성시간: 수, 2007/02/07 - 11:12오전
아래와 같이 클래스 A와 B가 있습니다.
A { ... } B { ... A* a; ... }
B 클래스는 A객체 포인터를 멤버로 가집니다.
B 클래스의 생성자 B() 에서 멤버 a를 NULL 포인터값으로 초기화 시키고자 합니다. 이럴 경우에 아래와 같이 B의 생성자를 정의하는 것이 올바른지 궁금합니다.
B() : a(NULL) {}
아니면... 아래와 같이 해야 하는지요?
B() { a = NULL; }
전자의 방법을 선택후에 컴파일하면 문제가 없긴 한데요, 제가 전자의 방법에 의문을 가지는 이유는, 클래스 A가 NULL 값을 받는 생성자가 정의되어 있지 않기 때문이란 것입니다. 그렇다고 후자의 방법은 초기화가 아니라.. 대입(assignment) 이기 때문에 ... 이것도 아닌거 같고..
C++ 에서.. 멤버가 포인터 타입일때, 전자의 방법을 택하면 알아서 NULL 포인터 값으로 초기화를 시켜주는 것인지 궁금합니다.
Forums:
http://www.parashift.com/c++-
http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6
> 제가 전자의 방법에 의문을 가지는 이유는, 클래스 A가 NULL 값을 받는 생성자가 정의되어 있지 않기 때문이란 것입니다.
멤버 a는 class A의 ctor과는 무관합니다.
멤버 a는 A type이 아니고 A* type입니다.
후자처럼 대입하면 ctor scope에서 임시 객체가 생성되고 소멸되므로 비효율적입니다만,
멤버 a가 pointer type(built-in type 취급)인 점과
일반적인 컴파일러는 temporary object elimination 최적화 한다는 점을 생각하면
전자처럼 initialization list에서 초기화하는 것과 차이가 없게 됩니다.
> C++ 에서.. 멤버가 포인터 타입일때, 전자의 방법을 택하면 알아서 NULL 포인터 값으로 초기화를 시켜주는 것인지 궁금합니다.
아닙니다. 알 수 없는 값이 들어갑니다.
다만, B의 Instance가 Global Variable인 경우에는 0으로 초기화됩니다.
___________________________________
Less is More (Robert Browning)
___________________________________
Less is More (Robert Browning)
댓글 달기