2011. 3. 7. 17:54
<복사생성자가 호출되는 시점>
1. 기존에 생성된 객체로 새로운 객체를 초기화하는 경우
2. 함수 호출 시 객체를 값에 의해 전달하는 경우
3. 함수 내에서 객체를 값에 의해 리턴하는 경우



1. 기존에 생성된 객체로 새로운 객체를 초기화하는 경우

 #include <iostream>
using std::cout;
using std::cin;
using std::endl;

class AAA
{
public:
 AAA()
 {
  cout<<"AAA() 호출"<<endl;
 }
 AAA(const AAA& a)
 {
  cout<<"AAA(const A& a) 호출"<<endl;
 }
};
int main()
{
 AAA obj1;
 AAA obj2=obj1; //AAA ojb2(obj1)이라는 문장으로 묵시적으로 변환됨

 return 0;
}



2. 함수 호출 시 객체를 값에 의해 전달하는 경우
call-by-value 함수 호출 과정
1) 매개 변수를 위한 메모리 공간 할당
2) 전달 인자 값의 복사
  => 복사생성자의 호출을 통해서 이 과정을 처리

 #include <iostream>
using std::cout;
using std::cin;
using std::endl;

class AAA
{
public:
 int val;
 AAA()
 {
  cout<<"AAA() 호출"<<endl;
 }
 AAA(int i)
 {
  val=i;
 }
 AAA(const AAA& a)
 {
  cout<<"AAA(const A& a) 호출"<<endl;
  val=a.val;
 }
 void ShowData()
 {
  cout<<"val: "<<val<<endl;
 }
};
void function(AAA a)
{
 a.ShowData();
}
int main()
{
 AAA obj1(30);
 function(obj1);

 return 0;
}




3. 함수 내에서 객체를 값에 의해 리턴하는 경우
- 리턴되는 값은 받아주는 변수가 없더라도, 함수를 호출한 영역으로 복사되어 넘어간다.
- 호출한 영역으로 객체가 복사되어 넘어갈 것.!

 #include <iostream>
using std::cout;
using std::cin;
using std::endl;

class AAA
{
public:
 int val;
 AAA()
 {
  cout<<"AAA() 호출"<<endl;
 }
 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 function(void)
{
 AAA a(10);
 return a;
}
int main()
{
 function(); //function().ShowData();

 return 0;
}





출처: 열혈강의 C++프로그래밍
Posted by Triany