#include<iostream>
using namespace std;
/////////////////////////////////////////////////////////////
// 변환 이야기
// Point -> int : 변환 연산자
// int -> Point : qusghks todtjdwk (인자가 1개인 생성자)
////////////////////////////////////////////////////////////
class Point{
int x, y;
public:
Point() :x(0),y(0){}
Point(int a , int b):x(a),y(b){}
//변환 연산자 : 객체를 다른 타입으로 암시적/ 명시적 형변환 되게 한다.
// 변환 연산자는 리턴값을 표시하면 에러이다.
operator int(){
return x;
}
Point(int a) :x(0),y(0){} // 변환생성자
};
/*
int main(){
double d = 3.4;
int n =d;
Point p(1,2);
int n2 = p; //p.operator int() 가 있으면 된다.
}
*/
int main(){
Point p1(1,2);
int n =p1; // p1.operator int() 이므로 OK
//Point -> int 변환
// p1=n; // int -> Point 변환
// 똑같은 의미에서 n.operator Point() 가 있으면 된다. 하지만 n 은 객체가 아니다 ㅠㅠ
p1=n; // 변환 생성자 적용 후 int 형생성자가 있으면 가능하다!
//컴파일러가 임시 객체를 만들어서 집어넣은뒤 대입연산자를 통해 넣어주게 된다.
}
================================ 활용 법 ===========================================
#include<iostream>
using namespace std;
class OFile
{
FILE *file;
public:
//모르는 연산자가 넘어오는 것을 방지하기 위해서.. 인자가 1개인 생성자가 암시적으로 변환을 일으키는 것을 막는다.
//explicit // 단! 명시적 변환은 된다.
explicit OFile (const char *name , const char *mode = "wt"){
file = fopen (name ,mode);
}
~OFile(){fclose(file);}
void write(const char *s){fwrite(s,1,strlen(s),file);}
//operator // 차세대 C++ 은 변환 연산자 앞에도 explocit 를 붙일 수 있따.
operator FILE*(){return file;} // 변환 연산자?!!!
};
/////////////////////////////////////////////////////////////////////
//변환 연산자의 적절한 예시
////////////////////////////////////////////////////////////////////
/*
int main(){
OFile f("a.txt");
f.write("hellow");
int n=10;
fprintf(f,"n=%d",n); //OFILE 이 파일포인터로 변환만 될수 있따면 ..ㅠㅠ 벼..변환 연산자?!
///////////////변환 연산자 후엔 다 슬수 있다.////////////////////
fputs("world",f);
////////////////다른 예를 들어보자! ////////////////////////////////////////////
// char s[10]="hello";
// String s2="aaa";
// strcpy(s,s2); //?
}
*/
void foo(OFile f){
}
int main(){
OFile f("a.txt");
foo(f); // 당연하다!!!!
//////////////explicit 적용전 ///////////////////////
/// foo("hellow"); //!?
//error 가 나와야한다
//잘된다!! char * -> OFile 이 면 된다!
//////////explicit 적용후는 안됨 ///////////////////////
foo((OFile)"hellow"); //의도적으론 된다.
}
==================================================================================================
'C,C++ > Android_FrameWork' 카테고리의 다른 글
[SSM 안드로이드 프레임워크 개발 강의]19. 메모리 릭을 체크하는 헤더만들기(operator New , Delete) (0) | 2012.08.15 |
---|---|
[SSM 안드로이드 프레임워크 개발 강의]18. New 연산자 이야기 (0) | 2012.08.15 |
[SSM 안드로이드 프레임워크 개발 강의]16. STL 과 함수객체 (0) | 2012.08.14 |
[SSM 안드로이드 프레임워크 개발 강의]15. STL find, strchr 구현하기 (0) | 2012.08.14 |
[SSM 안드로이드 프레임워크 개발 강의]14-3.실제로 안드로이드 프레임웤에서 사용되는 스마트 포인터 (0) | 2012.08.14 |