본문 바로가기
프로그래밍 언어/C++

[C++] class this 키워드

by 까망 하르방 2025. 2. 8.
반응형

this

멤버함수 내에서만 사용

멤버함수 호출하는 개체 주소

멤버 함수는 호출시 this가 같이 전달 - this call 방식

static 멤버 함수에서는 this 사용 불가

friend함수, 전역함수에서 this 사용 불가

 

 

[this 예제]

#include <iostream>

class Point
{
    int x, y;
public:
    void set(int a, int b)  // void set(Point* this, int a, int b)
    {                      
        x = a;              // this->x = a;
        y = b;              // this->y = b;
    }
};

int main()
{

    Point p1, p2;
    p1.set(20, 40); // 컴파일러에 의해 set(&p1, 20, 40) 으로 변경
}

 

this 사용되는 경우

멤버 데이터 명확히 하고 싶은 경우

멤버 함수를 연속적으로 호출 할 수 있다.

 

 

[예제]

#include <iostream>

class Count
{
	int count = 0;
public:
	void set(int count)
	{
		this->count = count;
	}
};

int main()
{
	Count c;
	c.set(0);
}

 

 

[예제]

*this 반환시에는 참조(reference) 반환 필요

class Counter
{
	int count = 0;
public:
	void reset(int c = 0)
	{
		count = c;
	}
	Counter* inc()
	{
		++count;
		return this;
	}
	Counter& dec()
	{
		--count;
		return *this;
	}
};

int main()
{
	Counter c;
	c.inc()->inc()->inc();
	c.dec().dec().dec();
}

[예시]  연속 호출 필요성

Stream 구조체 통해 다양한 타입 출력

#include <stdio.h>
#include <iostream>

using namespace std;

struct Stream
{
    void printf(int n);
    void printf(char c);
    void printf(double d);
    void printf(const char* s);
};

void Stream::printf(int n)
{
    ::printf("%d", n);
}
void Stream::printf(char c)
{
    ::printf("%c", c);
}
void Stream::printf(double d)
{
    ::printf("%lf", d);
}
void Stream::printf(const char* s)
{
    ::printf("%s", s);
}

int main(void)
{
    Stream c;
    c.printf(5);
    c.printf('A');
    c.printf(3.14);
    c.printf("seoul");
}

 

 

[예제] this 활용

객체를 반환받으면서 연쇄적으로 표현 가능

#include <stdio.h>
#include <iostream>

using namespace std;

struct Stream
{
    Stream& printf(int n);
    Stream& printf(char c);
    Stream& printf(double d);
    Stream& printf(const char* s);
};

Stream& Stream::printf(int n)
{
    ::printf("%d", n);
    return *this;
}
Stream& Stream::printf(char c)
{
    ::printf("%c", c);
    return *this;
}
Stream& Stream::printf(double d)
{
    ::printf("%lf", d);
    return *this;
}
Stream& Stream::printf(const char* s)
{
    ::printf("%s", s);
    return *this;
}

int main(void)
{
    Stream c;
    c.printf(5).printf('A').printf(3.14).printf("Seoul").printf('\n');
}
반응형

댓글