장르: 애초에 역경을 딛고 이룩하는 숭고한 사랑이란 없다. 그 역경 자체가 사랑이다.
프로그램 특징: 그 곳에서 살아남는 사랑이 어떤 모습으로 걸어오는지 기다려 보고 싶다.
Method a.k.a. Interface Function a.k.a. Member Function
Method default form
static return_type class name :: function (arguments) const;
this pointer
현재 설계 중인 제품의 전화 번호는 미래에 결정된다. 그런데 제작자는 아직 결정되지 않은 전화 번호를 이용해야 하는 코드를 작성해야 할 수 있다.
현재 시점에서 미래의 전화 번호에 접근하는 방법이 this pointer 입니다.
int main()
{
USERDATA user = { , , print};
user.Print(&user);
// cpp
user.Print();
return 0;
}
클래스 객체(인스턴스) user가 선언되는 시점은 클래스를 정의하고 난 나중 일이다. Print()에서 user 구조체 주소를 넘겨 받아 데이터를 반환하려면 user의 주소가 필요한데 아직 주소를 모른다. cpp의 매개변수 칸에도 눈에 보이지 않을 뿐 &user를 전달하고 있다. 이렇게 첫 번째 argument로 전달된 instance address는 this 포인터(지역 변수)에 저장된다.
class abc
{
public:
abc(int param) : idx(param) {};
void print() { cout << this->abc::idx << endl;}
private:
int idx;
};
int main(){
abc a(1), b(2);
a.print();
1 이 나온다.
명확히 말하면
- a.print() 에 사실은 &a 매개변수를 넘겨준다.
- public: void print(abc * pdata) { abc * this = pdata; )를 위에 가지고 있어
-
- this = & a
this -> 를 이렇게 이용하는 것이다.
| 메서드 함수 내부에서 실제 클래스 인스턴스의 주소를 가리키는 포인터이다.
const
const는 안전 장치이자 배려이자 작성자 수준을 가늠하는 사용자 친화 코드 이자 미래이다. int Getdata() const {} 상수형 메서드로 정의하면 멤버 변수의 값을 write (변경) 수 없고, const 메서드 내에서 const가 아닌 함수를 호출할 수 없다.
추가 내용: 상수화 하는 방법은 Class *\this 를 const Class *\this 로 변경하는 것이다.
static
cpp에서 전역 변수를 사용하는 것은 좋은 선택이 아니다. 이를 해결하기 위해 전역 변수와 동일한 동작을 하지만 클래스 멤버로 소속을 가지는 static을 이용한다.
- 사용자 코드에서 클래스 메서드를 사용하려면 무조건 인스턴스 선언하거나 new 연산으로 동적 인스턴스를 생성하고 멤버 접근 연산자로 호출해야 한다.
정적 멤버 함수는 인스턴스 선언 없이 직접 호출할 수 있다. 그러나 *\this 사용이 불가능하며 선언과 정의를 반드시. 반듯이. 분리해야 한다.
class Class
{
public:
Class(int nparam) : mdata(nparam) { mCount++;}
int Getdata() { return mdata;};
void resetCount() {mCount = 0;};
// static method definition & declaration
static int GetCount() { return mCount; };
private:
int mdata;
// static method definition
static int mCount;
};
// static method declaration
int Class::mCount = 0;
int main(int argc, char* argc[])
{
Class a(10), b(0);
cout << a.Getdata() << endl; // static
cout << Class::GetCount() << endl; // access without an instance
b.resetCount();
cout << b.GetCount() << endl;
return 0;
}
결과값은
10
2
0
정적 멤버 함수는 인스턴스 및 멤버 접근 연산자(resetCount)를 이용해도 되고 클래스 이름::범위 지정 연산자(public)을 이용해 인스턴스 없이 직접 호출도 가능하다.
'Computer Science > Object Oriented Programming' 카테고리의 다른 글
[JAVA] 이것이 자바다(3판) 5장 9번 답안 (1) | 2025.04.15 |
---|---|
[cpp] 복사 생성자 (2) | 2024.11.13 |
[Template] Class template (0) | 2024.10.18 |
[cpp] Class (1) | 2024.10.16 |
[Polymorphism] Overloading (0) | 2024.10.15 |