[열혈 C++] Chapter 5
C++ 스타일의 초기화
int num(20); // int num=20; 으로 작성해도 묵시적 변환이 이루어진다
디폴트 복사 생성자
SimpleClass(const SimpleClass ©) : num1(copy.num1), num2(copy.num2) { }
explicit
해당 키워드를 사용하면 대입 연산자를 이용한 생성자 호출은 불가능(묵시적 변환을 막음)
explicit SimpleClass(const SimpleClass ©) : 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); }
복사 생성자가 호출되는 시점
메모리 할당과 동시에 초기화가 이루어 질 때
- 기존에 생성된 객체를 이용해서 새로운 객체를 초기화하는 경우
- Call-by-value 방식의 함수호출 과정에서 객체를 인자로 전달하는 경우
- 객체를 반환하는 경우 (참조자형 반환 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; }
Author And Source
이 문제에 관하여([열혈 C++] Chapter 5), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dch3000/열혈-C-Chapter-5저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)