5월25일 C++(복사생성자,대입연산자,종속대입연산자.종속복사생성자,템플릿)API(simplepaint2)
2010. 5. 25. 10:12ㆍ2010년/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
'2010년 > 5월' 카테고리의 다른 글
5월27일 C++(순수가상함수,sort,setf(ios_base::boolalpha,showpos,hex,width)API(비트맵뷰어) (0) | 2010.05.27 |
---|---|
5월26일 C++(템플릿함수,inline,클래스밖 함수구현템플릿,virtual 객체기반)API(비트맵뷰어) (0) | 2010.05.26 |
5월24일 C++(SmartPointer,namespace,연산자오버로딩 API(대화상자 후반부) (0) | 2010.05.24 |
5월20일 C++(예외처리 try,catch,throw) API(멍때림) (0) | 2010.05.20 |
5월19일 C++(const, static,virtual,동적바인딩,순수가상함수 API(라디오박스,에디트박스,콤보박스) (0) | 2010.05.19 |