참조형식 멤버변수 초기화
- 참조 형식으로 선언된 멤버변수는 반드시 선언과 동시에 초기화해야한다.
- 그러므로 반드시 생성자 초기화 목록을 이용해 초기화해야한다.
class CTest
{
public:
CTest(int &rParam) : m_nData(rParam) {};
int GetData(void) {return m_nData;}
private:
int &m_nData;
};
int main(){
int a = 10;
CTest t(a);
cout << t.GetData() << endl; //10출력
a = 20; // 참조 원본인 a의 값이 수정되었다.
cout << t.GetData() << endl; //20출력
return 0;
}
참조형식 멤버변수를 생성자 초기화 목록을 사용하지 않고 초기화하려고 할때.
CRefTest(int &rParam) {m_nData = rParam;};
- '='는 단순 대입연산자이다.
- 선언 및 정의가 아닌. 이미 선언된 인스턴스를 이용해서 연산하는 것에 불과하다.
- 초기화하지 않고 사용했기 때문에 컴파일 오류가 발생한다.
CRefTest(int rParam) : m_nData(rParam) {}; //m_nData를 출력해보면 쓰레기값이 출력된다.
//rParam은 생성자함수가 끝나고 소멸한다.
- 참조자가 가리키는 원본이 이미 삭제되었기 때문에 쓰레기값이 출력된다.
- 생성자의 매개변수를 참조형식이 아니라 int rParam이라고 작성했기때문.
- 함수의 매개변수는 함수 내부의 자동 변수와 같으므로 함수가 반환될 때 매개변수는 소멸된다.
- 따라서 m_nData(rParam)라는 코드는 결국 사라질 대상에 대한 참조자가 초기화되는 결과를 초래. (주소값을 저장한 것도 아니라서 매개변수가 사라지지 않았어도 잘못된 것임)
*참조자 특징: 가리키는 대상을 만드시 규정해야한다. 중간에 원본 대상을 바꿀 수 없다.
'◼️C++' 카테고리의 다른 글
[C++] 명시적 디폴트 생성자 (0) | 2023.09.17 |
---|---|
[C++] 생성자 다중정의 (0) | 2023.09.17 |
[C++] 동적 객체의 생성과 소멸 (0) | 2023.09.17 |
[C++] 생성자와 소멸자 (0) | 2023.09.17 |
[C++] 클래스 접근 제어 지시자 (0) | 2023.09.17 |