본문 바로가기

프로그래밍/디자인패턴

[ST교육] thiscall 1


ST 교육 들었던 것 정리 !



1. this call


시작하기 전에 먼저 천천히 정리를 해보자!


클래스는 객체의 공통성을 표현하는 정의, 개념, 틀 형식이다. 

클래스의 객체는 자신만의 멤버 변수와 멤버 함수를 갖는다. 

클래스 내부에서 static으로 멤버 변수와 멤버 함수가 선언될 수 있다.

static 멤버변수와 멤버함수는 멤버 변수, 함수보다도 일반 전역 변수, 함수와 비슷하며, 
객체가 소유하지 않는 멤버 변수, 멤버 함수이다.

그렇다면 이런 객체가 소유하지 않는 멤버 변수, 멤버 함수를 왜 만드는 것일까?

말 그대로 static 은 객체와 무관한 변수, 함수를 만들 때 쓰인다. 



static 멤버 변수에 접근하기 위해서는 함수나 객체가 static 이여야 한다. 

또한 static 멤버 변수의 정의는 class 외부에 있다. 


위의 예제를 보면 생성자에서 static 멤버 변수 nCnt가 증가하고, 소멸자에서 감소한다. 


객체마다 nCnt를 갖고있다면, Department 객체의 총 개수를 알 수 없기 때문에 

객체와 무관한 static 변수를 두어 객체의 개수를 알 수 있게 하는 역할을 한다. 


또한 static 멤버 변수에 접근하기 위한 함수 역시 다른 멤버 함수와 무관하게

언제든 접근할 수 있어야 하므로 static 으로 만들어줘야한다. 


위의 실행 값은 

1 2 1 이다.


객체를 생성할 경우 생성자로 들어가서 nCnt가 1개, 2개 올라간다.

포인터를 지우면 nCnt가 하나 줄어들어 1개가 된다. 



이제 this call 1 을 보자 .!



a)와 b) 는 각각

this->x = a;

this->y = b; 와 같다. this 가 생략되어 있는 것이다. 


c) 에서

x = a; 는

this->x = a; 로 바뀔 수 있어야 한다. 

하지만 set2() 함수는 static 멤버 함수이기때문에 this가 없다. 즉 객체와 무관한 함수이다. 

때문에 staitc 멤버 함수는 그냥 멤버 변수에 접근할 수 없다. 

(일반 전역 함수와 비슷하므로 멤버 변수에 접근하려면 내부에 객체를 선언하거나, 매개변수를 받아야 한다.)

고로 c는 error이다. 


d)를 보자.

set2() 함수는 static 함수이므로 객체 없이 호출될 수 있다.


e) 문제없이 잘 실행된다. 



정리를 해보자.
static 함수는 객체 없이 호출 될 수 있고, 멤버 변수에 접근 할 수 없다.




http://blog.daum.net/coolprogramming/67