[열혈 C++] Chapter 5

동글·2022년 3월 20일
0

C++

목록 보기
5/5

C++ 스타일의 초기화

int num(20); // int num=20; 으로 작성해도 묵시적 변환이 이루어진다

디폴트 복사 생성자

SimpleClass(const SimpleClass &copy) : num1(copy.num1), num2(copy.num2) { }

explicit

해당 키워드를 사용하면 대입 연산자를 이용한 생성자 호출은 불가능(묵시적 변환을 막음)

explicit SimpleClass(const SimpleClass &copy) : num1(copy.num1), num2(copy.num2) { }
// SimpleClass sim1(10,20);
// SimpleClass sim2=sim1; (X)
// SimpleClass sim2(sim1); (O)

Shallow Copy & Deep Copy

위 상황에서, Bag 1에 대한 멤버간 복사가 이루어지면 같은 주소를 가리키는 포인터 2개가 생성된다 (Shallow Copy) 여기서 Bag 1의 포인터에 대해 delete를 호출하면, Bag 2는 유효한 값을 갖지 않는다 이를 방지하기 위하여 포인터로 참조하는 대상까지 복사하는 것을 Deep Copy라고 한다.
// Deep Copy 코드 예시
 Person(const Person& copy)
 {
 	name = new char[strlen(copy.name)+1];
    strcpy(name, copy.name);
 }

복사 생성자가 호출되는 시점

메모리 할당과 동시에 초기화가 이루어 질 때

  1. 기존에 생성된 객체를 이용해서 새로운 객체를 초기화하는 경우
  2. Call-by-value 방식의 함수호출 과정에서 객체를 인자로 전달하는 경우
  3. 객체를 반환하는 경우 (참조자형 반환 x)

클래스 외부에서 객체에 접근하기 위해 필요한 것

  • 객체에 붙여진 이름
  • 객체의 참조 값
  • 객체의 주소 값

임시객체

  • 객체를 생성한 후 변수로 받지 않는 경우 임시객체의 참조값이 반환된다
    따라서 다음 과 같이 받을 수 있다
    const Temporary &ref = Temporary(300);
  • 다음의 경우, tempRef 라는새로운 객체를 생성하는 것이 아닌 반환된 임시객체에 이름을 할당하는 것이다
class SoSimple { .... };

SoSimple SimpleFuncObj(SoSimple ob)
{
	cout<< "Parameter ob 생성" << endl;
	return ob;
}

int main(void)
{
	SoSimple obj;
    So Simple tempRef = SimpleFuncObj(obj); // 생성자 호출 (x)
    return 0;
}

0개의 댓글