변환함수와 복사생성자 질문

vani2의 이미지

이 역시 soen.kr을 보고 의문점이 생겼는데요..

class Time

{

private:

int hour,min,sec;
public:

operator Time() {
return 123;
}//자기자신을 갖는 변환함수?

Time(int abssec,int dld=0) {

hour=abssec/3600;

min=(abssec/60)%60;

sec=abssec%60;
cout<<"객체생성"< }
~Time() {
cout<<"객체파괴"< }

void OutTime() {

printf("현재 시간은 %d:%d:%d입니다.\n",hour,min,sec);

}

};

위의 코드에서

operator Time() {
return 123;
}//자기자신을 갖는 변환함수?

이 부분이 의미가 있을까요?

2) 변환 생성자를 선언할때 레퍼런스를 받는게 나을까요 아니면 값을 받는 것이 더 나을까요?(차이가 있는지 여부)
class Ex {
...

}

class Ex2 {
...
Ex2(Ex ex) {
...
}

or

Ex2(const Ex& ex) {
...
}

3) 객체에 재대입 하는것은 정상적인 일인가요?
soen.kr의 c++문법강좌 26-3 변환 생성자파트를 보시면 다음과 같은 클래스가 선언되어 있습니다..

class Time

{

private:

int hour,min,sec;

public:

Time() { }

Time(int abssec) {

hour=abssec/3600;

min=(abssec/60)%60;

sec=abssec%60;

}

void OutTime() {

printf("현재 시간은 %d:%d:%d입니다.\n",hour,min,sec);

}

};

void main()

{

Time Now(3723);

Now.OutTime();

}

...

그리고 다음과 같이 사용을 했는데요..
객체 내부에 동적할당을 사용하니, 대입된 객체들이 소멸자를 호출하지 못해서 내부적으로 동적할당된 변수를 delete를 못해서 다운을 일으키던데요.. 다음과 같은 방법을 사용해도 괜찮은 건가요?

Time t;

t = 21421314;
t = 4242;
t = 3244;
//내부적으로 동적할당을 사용하지 않으면 에러가 발생하지 않음.
//내부적으로 동적할당을 사용하면 마지막에 대입된 Time(3244) 객체의 소멸자만 호출됨.

아니면 내부적인 동적할당을 사용할땐 operator=를 정의해 주어야 하나요?

4) 함수의 리턴값으로 객체를 사용하면 왜 복사 생성자가 호출되나요?

후..

질문이 많았네요..

초보라서 이것저것 궁금하네요 :)

shint의 이미지

테스트 해보면 결과가 나오죠. ㅇ_ㅇ;;
http://codepad.org/

//Convert2
class Time
{
private:
     int hour,min,sec;
public:
     Time()
    {
        printf("Time()\n");
    }
     Time(int abssec) {
        printf("Time(int abssec)\n");
          hour=abssec/3600;
          min=(abssec/60)%60;
          sec=abssec%60;
     }
    Time(int h, int m, int s) {
        hour=h; min=m; sec=s;
        printf("Time(int h, int m, int s)\n");
 }
    operator int() {
        printf("operator int()\n");
        return hour*3600+min*60+sec;
    }
     void OutTime() {
          printf("OutTime() 현재 시간은 %d:%d:%d입니다.\n",hour,min,sec);
     }
};
 
int main()
{
    printf("[1]\n");
     Time Now(18,25,12);
     int i=Now;
     printf("[2] i=%d\n",i);
    return 0;
}
 
//출력
[1]
Time(int h, int m, int s)
operator int()
[2] i=66312
 
 
//Convert3
class Time
{
private:
     int hour,min,sec;
public:
     Time()
    {
        printf("Time()\n");
    }
     Time(int h, int m, int s)
    {
        hour=h; min=m; sec=s;
        printf("Time(int h, int m, int s)\n");
    }
     void OutTime()
    {
          printf("OutTime() 현재 시간은 %d:%d:%d입니다.\n",hour,min,sec);
     }
     int TimeToInt() {
        printf("TimeToInt()\n");
          return hour*3600+min*60+sec;
     }
     void IntToTime(int abssec) {
        printf("IntToTime()\n");
          hour=abssec/3600;
          min=(abssec/60)%60;
          sec=abssec%60;
     }
};
 
int main(int argc, char *argv[])
{
     printf("[1]\n");
     Time Now(18,25,12);
     printf("[2]\n");
     int i=Now.TimeToInt();
     printf("[3]i=%d\n",i);
 
     Time Now2;
     printf("[4]\n");
     Now2.IntToTime(i);
     printf("[5]\n");
     Now2.OutTime();
     printf("[6]\n");
    return 0;
}
 
//출력 결과
[1]
Time(int h, int m, int s)
[2]
TimeToInt()
[3]i=66312
Time()
[4]
IntToTime()
[5]
OutTime() 현재 시간은 18:25:12입니다.
[6]

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.