본문 바로가기
C++/C++ 문법

C++ 멤버 함수와 this 포인터

by Sein_ 2025. 10. 14.
728x90

[Do it C++ 완전정복_ 276~281p]

객체의 메모리 구조

클래스는 설계도이며, 객체(Object)는 실제 메모리에 생성된 실체다.
객체가 생성되면,

  • 멤버 변수는 객체마다 별도의 메모리 공간을 가진다.
  • 멤버 함수는 모든 객체가 하나의 공통 코드 공간을 공유한다.
class Car {
private:
    int speed; // 객체마다 따로 존재
public:
    void drive() { cout << "주행 중" << endl; } // 공통 코드
};

 

여기서 질문

멤버 변수는 객체마다 별도의 메모리 공간에 저장되고, 멤버 함수는 공통 코드 영역에 저장된다고 했다.
그렇다면 멤버 함수는 어떻게 자신이 호출된 객체의 멤버 변수 주소를 알고 그 값을 변경할 수 있을까?

this 포인터를 이용해 값을 변경할 수 있다.

 

멤버 함수와 this 포인터

  • 멤버 함수가 호출될 때, 자신을 호출한 객체의 주소를 가리키는 숨겨진 포인터 변수
  • 컴파일러가 멤버 함수에서 어떤 객체의 멤버 변수에 접근해야 하는지 알 수 있도록 this 포인터를 자동으로 전달한다.
class Car {
private:
    int speed;
public:
    void setSpeed(int s) { speed = s; }
};


// 사용자가 작성한 코드
Car a, b;
a.setSpeed(100);
b.setSpeed(200);

// 컴파일러 내부 동작
Car_setSpeed(&a, 100);   // this = &a
Car_setSpeed(&b, 200);   // this = &b

 

이외 this 포인터 사용

지역 변수와 구별

멤버 함수 안에서 매개변수 이름이 멤버 변수와 동일할 때,  this 포인터를 이용하여 멤버 변수를 명시적으로 구분

class Student {
private:
    int age;
public:
    void setAge(int age) {
        this->age = age;
        // 왼쪽: 멤버 변수, 오른쪽: 매개변수(지역 변수)
    }

    void show() {
        cout << "나이: " << age << endl;
    }
};

 

멤버 함수 체이닝 구현

멤버 함수에서 자기 자신을 참조형(*this)으로 반환하면, 하나의 객체로 여러 멤버 함수를 연속 호출할 수 있다. 

class Calculator {
private:
    int value;
public:
    Calculator() : value(0) {}

    Calculator& add(int n) {
        value += n;
        return *this; // 자기 자신 반환
    }

    void show() {
        cout << "결과: " << value << endl;
    }
};

int main() {
    Calculator c;
    c.add(10).show();  // 체이닝 방식
}