본문 바로가기
C++

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

by 상레알 2009. 1. 8.
복사 생성자가 호출되는 시점은 다향하다 물론 복사 생성자를 적절히 정의했다면 언제 호출되건 신경 쓰지 않아도 된다.
그러나 보다 효율적인 프로그램 작성을 위해서는 복사 생성자가 호출되는 시점을 정확히 이해 하고 있어야 한다.

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

1. 기존에 생성된 객체로 새로운 객체를 초기화하는 경우
2. 함수 호출 시 객체를 값에 의해 전달하는 경우
3. 함수 내에서 객체를 값에 의해 리턴하는 경우

Call - by -Value 에 의한 함수 호출 과정

1. 매개 변수를 위한 메모리 공간 할당
2. 전달 인자 값의 복사

-ps : 매개 변수도 일종의 지역 변수, 초기화 되는 시점이 함수가 호출되는 시점이라는 것만 제외하면 그 특징이 지역 변수와
       같다!!


객체를 Call-By-Value 로 값을 전달하는 경우 복사생성자가로 값을 복사하는대 이 과정을 책을 통해 다시 보는것도 괜찮을 듯 하다!  흠... 머 예를 들자면
↓ 클래스 ㅋㅋ
obj가 객체이고   매개변수 를 a 라고 하자    객체복사 하는 함수는 TEST(AAA a) 이렇게 되어 있다고 가정하엿을떄

obj 객체는 매개변수 a에 복사해야한다 이 과정에서  단순히 값을 복사하는게 아니라 복사 생성자의 호출을 통해서 이 과정을

처리한다.  (아! 참고로  객체는 ①메모리 할당  ②생성자 호출  이  두 과정이 지나야지만 진정한 객체라고 부를수 잇다고 한다는 생각을 떠올렷으면..한다!, 그리고 복사 생성자 는 멤버 변수의 값만 복사한다!  <- 이건 좀 그런가 ㅋㅋ)

그렇다면 이제 C언어에서 구조체하고 생각을 같이 해본다면   C언어에서 구조체 변수가 복사되어 넘어가는 것처럼 그냥 멤변수 대 멤버 변수가 복사되도록 하지 않고 굳이 복사 생성자의 호출을 통해서 복사 하도록 한 이유는 어디에 잇을까??

C언어에서 구조체 변수 복사는 얕은 복사 형태를 취한다 C언어에서는 이러한 형태의 복사가 별로 문제 될것이 없지만 C++의 경우에는 이러한 형태의 복사 방식이 문제가 될 수 있다.   그 이유는 앞에서 말을 햇었지만  [ 포인터,메모리 할당..]  이래도 생각이 안나는가??-_- 그렇다면 다시 복사생성자를 공부할수 잇도록!


=== 함수 내에서 객체를 값에 의해 리턴하는 경우

ex) cout<< fountion()<<endl;
↑  위 와같이 되어있을경우 fountion() 함수의 리턴값이 출력이 된다 
중요한것은 "리턴되는 값은 받아주는 변수가 없더라도, 함수를 호출한 영역으로 복사되어 넘어간다"
자 그렇다면 이제 또 다른 예제를 보도록하쟈

#include <iostream>
using namespace std;

class AAA
{
int val;
public:
AAA(int i){
val = i;
}

AAA(const AAA& a){
cout<< "AAA(const A& a)호출 "<<endl;
val = a.val;
}
void ShowData(){
cout<<"val: " <<val<<endl;
}
};

AAA fountion(void)
{
AAA a(10);
return a;
}
int main()
{
funtion();

return 0;
}


위 예제를 보면 객체a 를 생성한 다음에 이 객체를 값에 의해 리턴하고 있다.
따라서 함수를 호출한 영역으로 객체가 복사되어 넘어갈것이다.

그렇다면 어떻게 a 객체의 복사본이 생성되었을까??

역시 복사 생성자에 의해 생성이 되어 원본 객체 a를 인자로 전달 받을 수 있는 생성자, 즉 복사 생성자에 의해 객체 생성이 완료 되어 복사 한다.

'C++' 카테고리의 다른 글

protected 멤버  (0) 2009.01.15
상속!!  (0) 2009.01.15
explicit &&&& mutable  (0) 2009.01.15
클래스와 Static  (0) 2009.01.15
클래스와 const  (0) 2009.01.14
복사생성자  (0) 2009.01.08
const 함수  (0) 2009.01.06
friend 선언  (0) 2009.01.06
This 포인터  (0) 2009.01.06
열혈강의 연습문제 4-2 /생성자/소멸자/객체 포인터 동적 할당/해체/문자입력받아서 순서대로 출력  (0) 2009.01.06