-
C++ 복사생성자/대입연산자Programing/C and CPlusPlus 2012. 7. 4. 16:06
□ 복사생성자 (copy constructor)
객체와 객체가 복사될때 호출되는 생성자 함수□ 복사생성자 호출시점
1. 객체생성시 객체에 인수로 전달
2. 함수호출시 객체를 인수로 전달
3. 함수에서 객체를 리턴할때###cpp
#include <iostream>
#include <iomanip>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>using namespace std;
class Star
{
private:
char *name;
int age;
public:
Star();
Star(char *, int);
~Star();
Star::Star (Star &_s);
Star& operator=(Star &);void Disp() const;
} ;
Star::Star():age(0)
{
name = new char [strlen("이름 무") +1];
strcpy (name, "이름무");
cout << " [ 인자 없는 생성자 ] " << endl;
}Star::Star(char *_n , int _a):age(_a)
{
#if 0
name = _n;
cout << "strlen : " << strlen(_n) << endl;
#endif
name = new char [strlen(_n) + 1];
strcpy (name, _n);
cout << " [ 인수 2개 생성자 ] " << endl;
}Star::~Star()
{
cout << " [ 소멸자 ] " << endl;if (name) {
cout << "name " << name << endl; // if 사용자 정의 복사생성자/대입연산자 에서 복사가 이뤄지지 않을 경우 crash 발생
delete[] name;
}}
/*//////////////////////////////////////////////////////////
복사 생성자 정의 필요
if not, destructor 시 delete [] 에서 crash
because Star t = s1; ->> 복사 생성자
소멸시 stack 의 경우 나중에 선언된 변수 t 가 우선 소멸되며
차례로 s2 - > s1 순서로 해제된다. 이때 s1 에서 t에서 해지한 name 을
다시 해지하려고 하여 crash 발생
///////////////////////////////////////////////////////////*/
Star::Star (Star &_s):age(_s.age)
{
name = new char [strlen(_s.name) + 1]; // 복사 필요
strcpy (name, _s.name); // 복사 필요
age = _s.age;
cout << " [ 구조체 생성자 ] " << endl;
}
Star& Star::operator=(Star & _s)
{
cout << "operator" << endl;if (name)
delete[] name;name = new char [strlen(_s.name) + 1]; // 복사 필요
strcpy (name, _s.name); // 복사 필요
age = _s.age;return *this;
}
/////////////////////////////////////////////////////////////////
void Star::Disp () const
{
cout << setw(10) << name << setw(7) << age << "살" << endl;
}int main()
{
Star s1("아이유" , 20);
Star s2("김수현" , 25);
#if 1
Star t; // 인수 없는 생성자
t = s1; // 있으나 마나 대입 생성자
#else
Star t = s1 // 복사 생성자
#endif
s1 = s2; // 있으나 마나 대입 생성자
s2 = t; // 있으나 마나 대입 생성자s1.Disp();
s2.Disp();cout << " Star = " << sizeof(Star) << endl;
cout << "******************************* " << endl;Star *p = new Star;
if (p == NULL) {
cout << " 동적 할당 실패 " << endl;
}return 0;
}
'Programing > C and CPlusPlus' 카테고리의 다른 글
[C] Key Press (0) 2019.03.04 [C++] 키입력을 위해 curses.h 사용하기 (0) 2019.03.04 [C++] Exception overloading (0) 2019.02.25 [C++] std::bind (0) 2016.07.27 C++ Programing (0) 2014.02.23