승쨩개발공부
[C++] this포인터, extern, friend 본문
this
이것의 주소
-> this가 사용된 객체의 주소를 저장하고 있다.
this를 사용하면 사용한 객체가 할당된 메모리 시작 주소를 보여준다.
-> 다음과 같이 CObj의 객체를 통해서 확인을 해보면 주소가 같은 것을 확인할 수가 있다.
class CObj
{
public:
void Func()
{
cout << "this: " << this << endl;
}
};
void main()
{
CObj obj1;
CObj obj2;
cout << "&obj1: " << &obj1 << endl;
obj1.Func();
cout << "----------------------------------" << endl;
cout << "&obj2: " << &obj2 << endl;
obj2.Func();
}
this 포인터의 사용
class CObj
{
public:
CObj() : m_pBuff(nullptr) {}
CObj(char* _pBuff)
{
this->m_pBuff = new char[strlen(_pBuff) + 1];
strcpy_s(this->m_pBuff, strlen(_pBuff) + 1, _pBuff);
}
~CObj()
{
if (this->m_pBuff)
{
delete[] this->m_pBuff;
this->m_pBuff = nullptr;
}
cout << "소멸자 호출" << endl;
}
}
extern
외부파일(.cpp 또는 .h) 어딘가에 전역 변수/함수가 존재한다고 알려주는 역활을 한다.
#include "stdafx.h"
extern int a;
void main()
{
cout << a << endl;
}
-> extern 키워드는 보통 찾아내기 쉽게 헤더파일을 따로 만들어서 명시해놓는다.
#pragma once
#ifndef __EXTERN_H__
#define __EXTERN_H__
extern int a;
endif//!__EXTERN_H__
extern 키워드를 사용할 떄는 아무 cpp 파일에 해당 자료형과 변수의 이름을 똑같이 전역 변수로
선언을 해야한다.
그렇지 않으면 링커 오류가 발생한다.
friend
private멤버를 타 클래스가 접근할 수 있도록 허용하는 것.
-> 은닉화를 위반하는 문법이다.
friend를 사용하여 다른 클래스 호출
#include "Girl.h"
class CBoy
{
public:
CBoy();
CBoy(int _a, int _b);
~CBoy();
public:
void Func();
void Girl_Func(CGirl* _girl);
private:
int m_iA;
int m_iB;
friend class CGirl;
};
friend를 사용하여 다른 클래스 안에 있는 함수 호출
#include "Girl.h"
class CBoy
{
public:
CBoy();
CBoy(int _a, int _b);
~CBoy();
public:
void Func();
void Girl_Func(CGirl* _girl);
private:
int m_iA;
int m_iB;
friend void CGirl::Boy_Func(CBoy* _boy);
};
friend 함수에서 호출된 클래스에서 호출한 클래스의 맴버 변수 및 함수에 접근이 가능하게된다
CGirl : 호출된 클래스
CBoy : 호출한 클래스
'C++' 카테고리의 다른 글
[C++] 객체 포인터 (0) | 2021.12.03 |
---|---|
[C++] 상속 (0) | 2021.12.03 |
[C++] 복사 생성자(얕은복사, 깊은복사) (0) | 2021.12.03 |
[C++] static과 클래스, 멤버함수 (0) | 2021.12.02 |
[C++] const와 클래스, 멤버함수, 이니셜라이져 (0) | 2021.12.02 |