승쨩개발공부

[C++] this포인터, extern, friend 본문

C++

[C++] this포인터, extern, friend

SeungHyune 2021. 12. 3. 02:25

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