수업기록

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);
///
}

복사 생성자의 예시

  1. 먼저 만들어진 객체를 매개 변수로 전달하여 객채를 생성할 경우
  2. 함수의 매개변수 형식이 객체 타입인 경우 (call by value)니까
  3. 함수의 반환타입이 객체타입인 경우 (함수의 반환도 임시 메모리 공간에 복사)

깊은 복사 / 얕은 복사

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() 과 같이!