인프런 커뮤니티 질문&답변

evilbition님의 프로필 이미지
evilbition

작성한 질문수

[쥬신게임아카데미 버거쌤] 완전 초보자를 위한 게임 C++

클래스의 개념과 구조체와의 비교 < 강의에서여

작성

·

315

1

public:

void Initialize(int iAtt)

{

/* 같은 클래스 내부에 선언된 함수에서는 private 멤버여도 접근가능 */

//this->iAtt = iAtt;

iAtt = iAtt;

iDef = 7;

iHp = 100;

iMp = 100;

}

=============아래는 메인 함수에서 출력한 코드예여===================

 

 

CPlayer Player_class; // 클래스 접근

Player_class.Initialize(10);

Player_class.Output();

 

CPlayer Special_Player;

Special_Player.Initialize(100);

Special_Player.Output();

 

제가 직접 친 거라서 코드 내용은 조금 다른데욥

 

위 멤버 함수 Initialize 코드에서 this->, (*this)가 생략? 된 거라고 하셨자나요

this->iAtt = iAtt; 이렇게 출력하면 정상 출력이 되는데

iAtt = iAtt; 이 코드로 출력 하면

Player_class랑 Special_Player 둘 다 -858993460 이런 값이 나오더라구요!

 

이유가?? 멀까요???!!!

근데 멤버 함수에서 받는 파라미터? 인자 이름을 바꾸면 정상 출력이 되긴 해여

 

답변 3

1

클래스 멤버 함수의 범위 적용 규칙이 있습니다.

이는 클래스 멤버 변수의 이름과 멤버 함수의 매개변수(인자 값) 이름이 같을 경우, 클래스의 멤버 변수는 멤버 함수의 지역 변수(매개변수 포함)들에게 가려진다는 것입니다. 우선 순위 기준 매개변수 > 멤버변수 입니다.

즉, 질문자님의 말씀대로 멤버변수의 이름도 iAtt, Initialize함수의 매개변수 이름도 iAtt이라면 멤버 변수는 매개변수에게 가려져서 Initialize함수 안에서 사용한 iAtt이란 이름은 이 함수의 지역변수(매개변수 포함)인 iAtt을 의미하게 됩니다.

다시 정리하면 함수를 호출하면서 매개변수로 할당된 iAtt이란 변수에 다시 매개변수인 iAtt의 값을 집어넣었다는 행위로 사실 의미가 없는 행위라고 볼 수 있습니다. 그래서 멤버 변수인 iAtt은 쓰레기 값이라 불리 우는 -858993460를 가지게 되는 것입니다. 즉, 멤버 변수인 iAtt에는 값을 채운 적이 없다라는 뜻이 되는 것입니다.

(*this) 를 생략하고도 수행이 된다라는 행위가 위와 같은 혼란을 일으키기 때문에 가급적 멤버 변수에는 헝가리안 표기법을 통해 앞에 m(멤버)을 붙이기도 합니다. 즉, 멤버 변수는 miAtt이라고 이름을 지어 질문자님 말씀처럼 혼동이 올 수 있는 상황을 방지하기도 하지요.

  • 추후 업데이트 할 내용으로서 초기화 목록 파트가 있는데 이 초기화 목록에서는 멤버와 매개 변수의 이름이 같아도 iAtt이란 이름을 정확히 멤버 변수와 생성자의 매개변수로 구분을 합니다. 이 부분은 추후 강의로 업데이트 해드리겠습니다^^

 

개인 사 이지만 집이 상 중이었어서 빠른 답변 못 드린 점 죄송합니다!

도움이 되셨길 바랍니다^^

 

1

매개변수의 변수명과 멤버변수의 변수명이 같잖아요?

컴파일러 입장에선 멤버변순지 매개변순지 알 수 없기에 우선순위를 정해 놓고 우선순위대로 판단합니다.

같은 변수명이면 매개변수가 멤버변수보다 우선순위가 높습니다.

그래서 iAtt= iAtt; <<<이 코드는 매개변수 = 매개변수;

로 동작한 것이고 그에 따라 멤버변수엔 값이 들어오지 않아서 쓰레기 값으로 남아 있기 때문에 멤버변수 값을 출력할 때 -858993460 같은 값이 나오는 것입니다.

숫자의 의미는 말 그대로 쓰레기 값이므로 아무 의미가 없고 이전에 같은 메모리 주소에 사용했지만 지금은 안 쓰이고 초기화도 안된 의미 없는 값입니다.

참고자료 https://mustbebetter.tistory.com/17

1

evilbition님의 프로필 이미지
evilbition
질문자

질문 적으면서 더 생각해봤더니 this포인터랑 인자를

컴퓨터가 구분을 못해서 이상한 값이 뜬 것 같은데 맞나여..?

그래소 받는 인자 이름을 바꾸면 정상출력이 되는 거시고..?????????

 

맞다면은!!!!!!

-858993460 ㅇㅣ 값이 먼지 알 수 잇을까여 ㅇㅅㅠ

질문 적으면서 더 생각해봤더니 this포인터랑 인자를 컴퓨터가 구분을 못해서 이상한 값이 뜬 것 같은데 맞나여..? -> 맞습니다. 위에서 말씀드린대로 멤버 변수의 우선순위 법칙에 따라 iAtt이란 변수를 모두 매개변수(함수의 인자)로 판단한 것입니다.

858993460 -> 이 값은 공간을 변수로서 예약한 후, 실제 사용할 값을 대입하지 않았을 때, 예약한 공간에 이미 자리 잡고 있던 값이라고 볼 수 있습니다. 컴파일러 환경에 따라 이렇게 의도적으로 집어넣은 값이 아닌 값의 경우 임의의 값을 집어넣어 쓰레기 값임을 쉽게 확인할 수 있기도 합니다. 이 값에 절대 의미를 부여하지 마시고 이러한 값이 확인될 경우, 이 공간에 왜 제대로 값이 들어가지 않았는가 확인해보는 습관이 필요합니다^^

evilbition님의 프로필 이미지
evilbition

작성한 질문수

질문하기