this 포인터

객체 자신을 가리키는 용도로 사용되는 포인터

어떤 객체에 의해 멤버함수가 호출되었는지 멤버함수를 호출한 객체의 주소값을 저장한 채 멤버함수의 매개변수로 전달되는 포인터 변수이다.

멤버함수는 다른 모든 멤버변수나 멤버함수에 접근할 때 this포인터를 통해 접근한다. this 포인터는 컴파일러에 의해 자동으로 선언되고 사용되어 진다.

단, 멤버호출시 사용자가 this 포인터를 명시적으로 기술하는 것도 가능하다.

 

1
2
3
4
5
6
7
8
9
10
11
12
class exClass
{
    private:
        int num;
    public:
        void exClass(int num)
        {
            this->num = 200;   // 클래스가 가지고 있는 멤버 변수
            num = 105;         // 함수의 매개변수
        }
        ......
};
cs

 

[예제] 이름과 나이를 대입하는 부분을 함수로 분리한 코드.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <string.h>
 
struct Friend
{
private :
    char m_name[8];   // 이름
    short int m_age;  // 나이
 
public:
    void InputData()
    {
        strcpy(m_name, "홍길동");  // 이름 대입
        m_age = 20;                // 나이 대입
 
        //Friend *const this;             // this 포인터에는 'data.'에 의해 전달된 주소 저장
        //strcpy(this->m_name, "홍길동"); // 이름 대입
        //this->m_age = 20;
    }
 
    void ShowData()
    {
        printf("내 친구 %s은 %d살 입니다. \n", m_name, m_age);
    }
};
 
void main()
{
    Friend data;        // 객체 인스턴스
    data.InputData();   // 친구의 정보를 받아온다.
    data.ShowData();    //대입된 이름과 나이를 출력한다.
}
cs

friend 함수

class의 private 멤버 변수는 같은 객체의 멤버함수만이 접근 가능하다는 점에서 객체지향 언어의 데이터 은닉성과 캡슐화를 지원한다.

즉, private 멤버 변수의 접근을 class의 내부로 국한시킴으로서 클래스 내부의 수정이 클래스 외부영역에 전혀 영향을 주지 못하기 때문에 프로그램의 유지보수가 쉬워지게 된다. 그러나 경우에 따라서 부득이하게 멤버함수가 아닌 일반함수가 private 멤버에 접근해야 하는 경우가 있다.

이때 사용되는 함수가 friend 함수이다. friend 함수는 일반함수 이면서 클래스의 private 멤버를 호출해 사용할 수 있다.


정적멤버 변수와 정적멤버 함수

정적멤버 변수는 클래스로 만들어진 객체들 사이에서 마치 전역변수와 같이 공용해 사용할 수 있는 멤버 변수이다. 정적멤버 함수도 정적멤버 변수와 같이 모든 객체가 공용해 사용 할 수 있으며 정적멤버 함수와 정적멤버 변수는 객체의 생성과 관계없이 프로그램의 시작과 동시에 만들어 진다.

 

- 정적멤버는 클래스로 만들어진 모든 객체가 공유해 사용 할 수 있는 멤버이다.

- 객체의 생성과 관계없이 프로그램의 시작과 동시에 만들어 지고 프로그램이 종료되면 사라진다.

- 정적멤버 변수가 동작하는 원리와 형태는 전역변수와 동일하다.

단, 정적멤버 변수의 경우 객체지향언어의 데이터 은닉성을 만족시키기 위해 클래스로 만들어진 객체 또는 정적멤버 함수를 통해서만 접근해 사용 할 수 있다.

- 정적멤버 변수는 초기값을 부여 할 수 있다. 단 초기값을 부여하는 행위는 클래스 밖에서 이루어져야 한다.

- 정적멤버 함수는 정적멤버 변수에 대한 접근을 위해 사용한다.

'C++' 카테고리의 다른 글

연산자 오버로딩  (1) 2019.11.27
생성자와 소멸자  (0) 2019.11.27
메모리 구조와 동적 메모리 할당  (0) 2019.11.27
C++이란?  (0) 2019.11.27

+ Recent posts