5월25일 C++(복사생성자,대입연산자,종속대입연산자.종속복사생성자,템플릿)API(simplepaint2)

2010. 5. 25. 10:122010년/5월




복사생성자는 객체가 만들어질때 호출되는것이아니라 이미 만들어진 객체가 다른곳으로 복사될때 호출되는생성자이다
1. 함수의 파라미터로 객체의 전달
2. 함수가 객체를 리턴
3. 객체의 선언에 사용된 대입 연산자
4. 임시 객체의 복사
5. 디폴트 파라미터에 명시된 생성자
복사생성자를 따로 구분지어서 정의를 내릴수도 있고 값을 넣어줄수도 있다.
클래스 정의된 객체에 다른 객체를 대입하는경우 자동으로 대입연산이 되는것이 아니고 복사생성자사 호출되어버린다.
그래서 객체에 선언에 사용되는 대입연산자는 이미 복사생성자 호출이 되어버린다. 그래서 대입연산자로 바꿔보겠다.

복사생성자의 간단한 예이다.

일단 기본적으로 생성자는 객체가 한번 생성될때 딱한번 실행되는것이 원칙이다 하지만 이 생성자를 여러번 사용하려고하는경우 바로 복사생성자가 호출된다. 이 생성자가 한번 객체가 생성될때 사용하였지만 옆에와 같이 동적할당으로 선언하고 그것을 불러 드리게 되는경우 생성자를 한번더 사용하게되는경우 복사 생성자가 호출된다.

다음같은경우 이미 디폴트 생성자가생성되었다 그리고 다음 객체를 복사생성자를 했다 하지만 에러가 떳다 그이유는 멀까?
이미 첫 생성자에 만든경우 동적할당을 했다. 그리고 2번째 객체에는 첫번째 생성자를 그대로 복사했다 그리고 소멸자로 할당을 반환했다.
그러면 첫번째 두번째는 이미 같은곳을 동적할당한것이다 그래서 반환을하면 이미 반환된곳이라서... 에러가 뜬다.







#include<iostream>
using
 namespace std;

class Test
{
  public:
    Test& operator =(const Test &T)
    {
      if(this==&T)  //자기 대입 방지 
      {
        return *this;
      }
      cout <<"대입 연산자 호출\n";
       *(this->p)=*(T.p);
       return *this;
    }
    int *p;
    Test(Test &T)
    {
      p=new int;
      *p=*(T.p);
    }
    Test(int k)
    {
      p=new int;
      *p=k;
      cout<<"생성자\n";
    }
    ~Test()
    {
      cout<<"소멸자\n";
      delete p;
      cout<<"재확인\n";
    }

};

int main()
{
  Test Obj(1);
  Test Obj2(Obj);  //복사생성자 호출
  Test Obj3(3);
  Obj=Obj;
  Obj3=Obj2=Obj;   //대입 연산자 호출 
  cout<<"끝\n";
  cout<<*(Obj.p)<<endl;
  cout<<*(Obj2.p)<<endl;
  cout<<*(Obj3.p)<<endl;
  return 0;
}
c++ STL
대입연산자는 자기가 자신에게 대입 못하게 막아야한다.
템플릿




=================================================================
=================================================================
API 심플페인트2