갓똥
나는야 프로그래머
갓똥
전체 방문자
오늘
어제
  • 분류 전체보기 (186)
    • 프로그래밍 (146)
      • 자바 (9)
      • 안드로이드 (2)
      • 유니티 (20)
      • C++ (38)
      • C# (56)
      • HTML (2)
      • 파이썬 (3)
      • 자료구조 (2)
      • 알고리즘 (0)
      • 문제풀이 (4)
      • 디자인 패턴 (7)
      • 카카오톡 봇 (1)
      • 엑셀 (1)
      • 기타 (1)
    • 게임 (21)
      • 테일즈위버 (0)
      • 카이로소프트 (1)
      • 순위 (19)
      • 기타 (1)
    • 일상 (13)
      • 카페 (1)
      • 방탈출 (12)
    • 기타 (6)
      • 웃긴자료 (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 전세계게임매출순위
  • 유니티 그래프
  • C++ 소멸자
  • C++
  • c# Thread
  • 게임매출순위
  • 게임 매출 순위
  • 유니티 그래프 그리기
  • C# boxing
  • pc 게임 순위
  • C++ 상속
  • Unity Graph
  • C# 예외 처리
  • pc게임 순위
  • c# unboxing
  • c# delegate
  • c# 코루틴
  • 롤 골드그래프
  • 모바일 게임 순위
  • 자바
  • 유니티 골드그래프
  • 전세계 게임 매출
  • c# collection
  • C++ virtual
  • 강남 방탈출
  • c# coroutine
  • 알고리즘
  • 글로벌게임매출
  • 게임 디자인 패턴
  • 2020년 게임 매출

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갓똥

나는야 프로그래머

[C++] this 포인터
프로그래밍/C++

[C++] this 포인터

2019. 11. 24. 02:00
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
    '프로그래밍/C++' 카테고리의 다른 글
    • [C++] 상속과 접근 지정자 (access specifiers)
    • [C++] 상속
    • [C++] const member function
    • [C++] static member function
    갓똥
    갓똥
    공부하며 알아가는 내용을 정리해 봅니다.

    티스토리툴바