this this는 상수 포인터 오로지 하나의 주소(생성된 객체의 주소 값인 상태)
→ 생성자/소멸자를 private로 숨겼을 때, 내부 클래스 안에서 아래와 같이 사용하기도 함.
static Cobj * GetObj(){
Cobj pInstance = new CObj;
return pInstance;
}
void Destroy(){
delete this;
}
복사생성자
복사 생성자를 사용하게 되면
원본에서 초기화하는 연산들을 재반복하는 것이 아니라,
메모리 단위로 객체 대 객체로 복사하기 때문에 일반 생성보다 더 빠르게 생성될 수 있다.
class CObj {
public:
//디폴트 생성자
CObj(int iA) : m_iA(0)
{}
//복사 생성자
CObj(const Cobj& rhs){
//원본 훼손 제한
m_iA = rhs.m_iA;
};
~CObj();
private:
int m_iA;
}
int main(){
////
CObj tmp;
CObj src(tmp);
///
}
복사 생성자의 예시
- 먼저 만들어진 객체를 매개 변수로 전달하여 객채를 생성할 경우
- 함수의 매개변수 형식이 객체 타입인 경우 (call by value)니까
- 함수의 반환타입이 객체타입인 경우 (함수의 반환도 임시 메모리 공간에 복사)
깊은 복사 / 얕은 복사
class CObj {
public:
CObj(const char* pName){
int iLength = strlen(pName) +1;
m_pName = new char[iLength];
strcpy_s(m_pName,iLength,pName);
}
~CObj(){
delete[] m_pName;
}
char* m_pName;
}
void PrintN(CObj obj){ cout << obj.m_pName;}
위 사항의 문제를 확인하는 키워드는 2개다. 깊은 복사 / 복사 생성자 (위 복사 생성자 생성 예시를 확인해볼 것.)
-체크 요소-
- 내 클래스가 포인터를 지니고 있나?
- 생성자 내에서 그 포인터를 할당하거나 주소를 참조하고 있나? (나는 지금까지 Initialize로 따로 빼어서 동적할당을 했기에 괜찮다.)
friend
friend class로 선언된 클래스는 friend class를 선언한 class의 private에도 액세스할 수 있다.
friend class Other
또한 함수도 friend로 선언할 수 있다.
friend void Other::Function() 과 같이!