복사생성자를 보면 이렇습니다.
클래스 이름 (const 클래스 이름 &참조변수)
즉, 상수로 선언된 참조자이며 type은 클래스(자기자신)이 되는 것입니다.
복사 생성자 자체는 원래 기존 값을 복사해 전달해주는 개념이라
이 과정에서 값이 바뀌어선 안됩니다.(복사인데 값이 바뀌게 된다면 복사가 아니겠죠?)
따라서 const로 선언된 것이고 정의되어 있습니다.
그렇다면 왜 참조자로 받느냐 인데.........
이걸 이해 하려면 우선 복사 생성자의 호출을 알아야 합니다.
복사생성자가 호출될 때는
1. 대입연산을 할 때
2. 매개 변수로 들어갈 때
3. 반환 값이 있을 때
즉,
#include <iostream>
#include <string>
using namespace std;
class A {
int num;
string name;
public:
A() {}
A(int num, string name) {
this->num = 10;
this->name = name;
}
A(const A &ref) { //디폴트 복사 생성자
num = ref.num;
name = ref.name;
cout << "복사 생성자 호출" << endl;
}
void fct_1(A obj) {
cout << "fct_1 함수 실행" << endl;
}
A fct_2(void) {
A obj;
cout << "fct_2 함수 실행" << endl;
return obj;
}
};
int main(void) {
A a(10, "Hwan");
a.fct_1(a);
cout << "fct_1 함수 실행 끝" << endl;
A b = a.fct_2();
cout << "fct_2 함수 실행 끝" << endl;
return 0;
}
이렇게 호출이 됩니다.
44행의 a.fct_1(a); 부분을 보면 아래와 같이 진행됩니다.
이런식으로 복사생성자가 실행되게 됩니다.
46행의 함수호출 a.fct_2()는 다음과 같이 실행되게 됩니다.
이런식으로 실행이 되게 됩니다.
즉, 위에서 말한대로
1. 대입연산을 할 때
2. 매개 변수로 들어갈 때
3. 반환 값이 있을 때
이러한 경우마다 실행이 되는데, 참조를 하게 되면 생성자 호출, 복사 생성자 호출을 안하게 됩니다.(무시함)
만약 참조자가 아닌 그냥 매개변수로 받게 된다면?
즉, A(const A &ref) -> A(const A ref)로 바꾸게 된다면.....
무한 루프에 빠지게 됩니다.
왜냐??
A(const A ref)는 새로운 A ref 에 대한 변수선언 임으로 복사생성자가 호출될 것입니다.
계속.......
때문에 복사 생성자가 무한 반복 일어나면 안되기 때문에 참조자로 받아 복사 생성자의 호출을 하지 않는 것입니다.
'프로그래밍 > C++' 카테고리의 다른 글
C++ 오버라이딩?? 이건 또 뭘까? (0) | 2019.03.04 |
---|---|
C++ 오버로딩? 그게 뭘까? (2) | 2019.03.04 |
C++ 소멸자란? (0) | 2019.02.22 |
C++ this 포인터?? 그럼 *this 는 뭐지? (8) | 2019.02.22 |
C++상속 관계에서의 생성자 호출 (4) | 2019.02.21 |
댓글