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(); // 체이닝 방식
}'C++ > C++ 문법' 카테고리의 다른 글
| C++ 부모 클래스 접근 지정자, 프랜드(friend) (0) | 2025.10.14 |
|---|---|
| C++ 오버로딩 (Overloading) (0) | 2025.10.14 |
| C++ 생성자와 복사생성자, 소멸자 (0) | 2025.10.14 |
| C++ 다형성 개념과 다형성 구현 (팩토리 클래스, 오버라이딩) (0) | 2025.10.14 |
| C++ 바인딩 (Binding) (0) | 2025.10.14 |