-
윤성우 열혈 C++ 프로그래밍 5장) 복사생성자(explicit, 임시객체)PROGRAMMING/C++ 2024. 1. 2. 22:27
새해라고 새벽부터 운동을 다녀오니까 매-우 피곤하다😑 하지만 이런게 갓생러 아니겠슴까! 오늘은 C++ 5장 정리를 뽀개고 자고자 한다ㅎㅎ
(혹시 저작권에 문제가 있다면 수정하겠습니다!! 개인적인 공부용으로 정리함을 알려드립니당)
https://product.kyobobook.co.kr/detail/S000001589147
복사생성자
아래 두 문장의 의미는 같다. 다만 첫번째 문장이 묵시적으로 변환되어 아래와 같이 작동하는 것이다.
(묵시적 변환을 방지하기 위해 explicit을 사용한다.)
SoSimple sim2 = sim1; SoSimple sim2(sim1);
이와 같은 복사생성자는 아래와 같은 형태를 하고 있을 것이다. (복사생성자가 생성자와 다르게 생긴 걸 확인해라!)
SoSimple(const SoSimple & copy){//}
🚨const와 &를 빼먹지 않도록 주의할 것 🚨
explicit
: 복사 새성자의 묵시적 호출을 허용하지 않는다.
디폴트 복사 생성자 : 맴버 대 맴버의 얕은 복사 → 맴버변수가 힙의 메모리 공간을 참조하는 경우 문제 발생
깊은 복사(멤버 뿐만 아니라 포인터로 참조하는 대상까지 복사)를 위해서는 복사 생성자를 따로 정의해야 한다.
복사생성자가 호출되는 시점 : 객체를 새로 생성하되, 생성과 동시에 동일한 자료형의 객체로 초기화 할 경우!!
경우 1. 기존에 생성된 객체를 이용하여 새로운 객체가 초기화되는 경우
int num1 = num2;
경우 2. Call-by-value 방식의 함수호출 과정에서 객체를 인자로 전달하는 경우
int SimpleFunc(int n){//} int num = 10; SimpleFunc(num); // 복사생성자 호출 // SimpleFunc이 호출되는 순간 n이 할당과 동시에 num에 저장된 값으로 초기화
경우 3. 객체를 반환하되, 참조형으로 반환하지 않는 경우
int SimpleFunc(int n) { // return n;} // 복사생성자 호출 int num = 10; cout << SimpleFunc(num) << endl; // 반환하는 값을 변수로 저장하는 것과 별.개.로 값을 반환하면 반환된 값은 별도의 메모리 공간이 할당되어서 저장된다.
👺 함수가 값을 반환하면, 별도의 메모리 공간이 할당되고, 이 공간에 반환 값이 저장된다.
👽 복사 생성자의 호출횟수는 프로그램 성능과도 관계가 있기 때문에 호출의 시기를 이해하는 것이 매우 중요하다.
임시객체
- 임시객체가 생성된 위치에는 임시객체의 참조 값이 반환된다.
- 임시객체는 다음 행으로 넘어가면 바로 소멸되어 버린다.
(임시객체의 참조 값).ShowInfo(); // 바로 다음 줄에서 소멸
- 참조자에 참조되는 임시객체는 바로 소멸되지 않는다.
const Temp & ref = Temp(300); // 다음 행에서도 접근이 가능하며, 소멸하지 않는다.
'PROGRAMMING > C++' 카테고리의 다른 글