728x90
반응형
1. this 포인터 개념
class Point {
int x = 0;
int y = 0;
public:
void set(int a, int b) {
x = a;
y = b;
}
};
int main() {
Point p1;
Point p2;
p1.set(10, 20);
p2.set(30, 40);
std::cout << &p1 << std::endl;
std::Cout << &p2 << std::endl;
}
① 객체를 여러 개 생성 할 때
=> 멤버 데이터는 객체당 한 개씩 메모리에 놓이게된다.
=> 멤버 함수는 객체의 개수에 상관없이 코드 메모리에 한 개만 있다.
② this
=> 멤버 함수 안에서 사용가능한 키워드
=> 자신을 호출한 객체의 주소를 담고 있다.
p1.set(10, 20); 코드를 통해 set함수는 p1의 멤버데이터는 바꿀까 p2의 멤버데이터를 바꿀까?
물론 p1.set이기 때문에 p1의 멤버데이터를 바꿀 것이다. 좀 더 자세히 살펴보면
p1.set(10, 20); 이라는 코드는 컴파일러가
set(&p1, 10, 20); 이라고 전달하게 된다.
void set(Point* this, int a, int b) {
this -> x = a;
this -> y = b;
}
2. this 포인터 활용
#include <iostream>
class Point {
int x = 0;
int y = 0;
public:
void set(int x, int y) {
x = x;
y = y;
}
};
int main() {
Point p1;
p1.set(10, 20);
}
위의 set함수는 멤버 데이터와 지역변수명이 같다.
이럴 경우 C나 C++은 가까운 곳을 보기 때문에 왼쪽의 x는 지역변수 x가 된다.
하지만 멤버데이터의 x에 지역변수 x를 넣고싶은데 이럴 경우 어떻게 해야 할까?
void set(int x, int y) {
this->x = x;
this->y = y;
}
① 이름 충돌 시
=> 멤버의 이름과 지역변수(함수인자)의 이름이 동일할 때 지역변수가 우선시 된다.
=> this를 사용하면 멤버에 접근할 수 있다.
#include <iostream>
class Point {
int x = 0;
int y = 0;
public:
// Point* set(int x, int y) {
// Point set(int x, int y) {
Point& set(int x, int y) {
this->x = x;
this->y = y;
return *this;
}
};
int main() {
Point p1;
// p1.set(10, 20)->set(30, 40)->set(50, 60); - Point*
p1.set(10, 20).set(30, 40).set(50, 60) // Point, Point&
}
② this를 반환하는 함수
=> this 또는 *this를 반환하면 멤버 함수를 연속적으로 호출할 수 있다.
=> cout의 원리
[주의] 참조 반환
=> *this를 반환 할 때는 임시객체의 생성을 막기 위해 참조를 반환해야 한다.
3. this 포인터 주의 사항
#include <iostream>
class Test {
public:
static void tmp() {
// this?
}
};
int main() {
Test::tmp();
Test t;
t.tmp();
}
① 정적 멤버 함수(static member function) 안에서는 this를 사용할 수 없다
728x90
반응형
'프로그래밍 > C++' 카테고리의 다른 글
[C++] 상속과 접근 지정자 (access specifiers) (1) | 2019.11.25 |
---|---|
[C++] 상속 (0) | 2019.11.24 |
[C++] const member function (0) | 2019.11.17 |
[C++] static member function (0) | 2019.11.17 |
[C++] static member data (0) | 2019.11.14 |