복사 생성자?
복사 생성자는 객체가 복사될 때 호출되는 성성자입니다.
복사 생성자를 정의하기 위해 함수의 매개변수 값으로 '객체'를 전달함.
복사 생성자가 필요한 경우?
동적 할당된 메모리 공간이 존재할 경우, 객체를 단순히 복사하면 문제가 발생할 수 있음.
기본 복사 생성자(얕은 복사) VS 복사 생성자(깊은 복사)
기본 복사 생성자: 멤버값이 사본 객체의 멤버값으로 똑같이 단순 복사됨.
복사 생성자: 멤버값이 사복 객체의 멤버값으로 동적 할당된 메모리 공간을 고려하여 복사됨.
예제(1)
#include<iostream> #include<cstring> using namespace std; class AAA { public: AAA() //생성자 { cout<<"AAA() 호출"<<endl; } AAA(int i) //생성자 { cout<<"AAA(int i) 호출"<<endl; } AAA(const AAA &a) //복사 생성자 { cout<<"AAA(const AAA &a) 호출"<<endl; } }; int main(void) { AAA obj1; AAA obj2(10); AAA obj3(obj2); // const AAA &a=obj2 return 0; } |
예제(2)
#include<iostream> #include<cstring> using namespace std; class Point { int x, y; public: Point(int _x, int _y) { x=_x; y=_y; } Point(const Point &p) { x=p.x; y=p.y; } void ShowData() { cout<<x<<' '<<y<<endl; } }; int main(void) { Point p1(10,20); Point p2(p1); p1.ShowData(); p2.ShowData(); return 0; } |
예제(3); Default 복사 생성자
#include<iostream> #include<cstring> using namespace std; class Point //클래스를 정의함 { int x, y; //정수 x, y를 정의함 public: Point(int _x, int _y) //함수를 정의함 {x=_x;y=_y;} /* Point(const Point& p) {x=p.x; y=p.y;} */ void ShowData() //출력 함수를 정의함 { cout<<x<<' '<<y<<endl;} }; int main(void) { Point p1(10,20); //함수 오버로딩 Point p2(p1); p1.ShowData(); p2.ShowData(); return 0; } |
예제(4)
#include<iostream> #include<cstring> using std::cout; using std::endl; class AAA //클래스 정의 { int val; //변수 val public: AAA(int i) //함수 AAA { val=i; } AAA(const AAA& a) //함수 AAA { cout<<"AAA(const A& a) 호출"<<endl; val=a.val; } void ShowData() //함수 ShowData() { cout<<"val: "<<val<<endl; } }; int main() { AAA obj1(10); //AAA 클레스 obj1 정의 AAA obj2=obj1; //AAA 클래스 obj1과 동일 return 0; } |
예제(5)
#include<iostream> #include<cstring> using std::cout; using std::endl; class AAA //클래스 정의 { int val; //변수 val public: AAA(int i) //함수 AAA { val=i; } AAA(const AAA& a) //함수 AAA { cout<<"AAA(const A& a) 호출"<<endl; val=a.val; } void ShowData() //함수 ShowData() { cout<<"val: "<<val<<endl; } }; void function(AAA a) { a.ShowData(); } int main() { AAA obj(30); function(obj); return 0; } |
예제(6)
#include<iostream> #include<cstring> using namespace std; class AAA //클래스 정의 { int val; //변수 val public: AAA(int i) //함수 AAA { val=i; } AAA(const AAA &a) //함수 AAA { cout<<"AAA(const A &a) 호출"<<endl; val=a.val; } void ShowData() //함수 ShowData() { cout<<"val: "<<val<<endl; } }; AAA function(void) //클래스 AAA를 이용하여 객체 a를 만들고 객체 a를 return하는 예제 { AAA a(10); return a; } int main() { function(); function().ShowData(); return 0; } |
예제(7)
#include <iostream> using namespace std; class Age { private: int *age; public: Age(int valueOfAge); Age(const Age &obj);//복사생성자 정의 int getAge() const{return *age;} void setAge(int valueOfAge){*age=valueOfAge;} }; Age::Age(int valueOfAge) { age=new int; //int *age; 가 존재하므로 여기서, age에 메모리 주소가 저장됨. *age=valueOfAge; } Age::Age(const Age &obj) { cout<<"Age boy=girl 호출"<<endl; age=new int; *age=obj.getAge();//동일 한 메모리 공간의 사용을 피하기 위해 원본객체의 age가 가리키는 값을 얻음 } int main() { Age girl(30); //int valueOfAge=30; cout<<"girl의 나이:"<<girl.getAge()<<endl; Age boy=girl; //const Age &obj=Age girl; 즉 참조에 의하여 const Age형을 전달 받음. cout<<"boy의 나이:"<<boy.getAge()<<endl; boy.setAge(100);//이 것은 원본 girl의 나이에 영향을 미치지 않음. cout<<"boy의 나이:"<<boy.getAge()<<endl; cout<<"girl의 나이:"<<girl.getAge()<<endl; return 0; } |
'C++Language' 카테고리의 다른 글
C++언어; 객체에 대한고찰 (0) | 2018.01.23 |
---|---|
C++언어(17); 클래스에서 const 사용 (0) | 2018.01.23 |
C++언어(14); 클래스; 객체의 동적 메모리 할당 (0) | 2018.01.21 |
C++언어(13); 클래스; 정수와 정수배열의 동적 메모리 할당 (0) | 2018.01.20 |
C++언어(11); 캡슐화; 클래스의 정보은닉 (0) | 2018.01.20 |