[완료]변환생성자 어떻게 호출하나요?

dltkddyd의 이미지

#include <iostream>
#include <cstring>
using namespace std;

class YString {
friend ostream &operator <<(ostream &rcout, YString &src);
private:
char* str;
int len;
public:
YString() {
str=NULL;
len=0;
}

YString(const char* src) {
len=strlen(src);
str=new char[len+1];
strcpy(str,src);
}

YString(YString &src) {//복사생성자. 깊은 복사
len=strlen(src.str);
str=new char[len+1];
strcpy(str,src.str);
}
YString &operator=(const char* src) {//변환연산자 함수
len=strlen(src);
delete[] str;
str=new char[len+1];
strcpy(str,src);
return *this;
}
YString &operator=(YString &src) {
len=strlen(src.str);
delete[] str;
str=new char[len+1];
strcpy(str,src.str);
return *this;
}
int length();
~YString() {
delete[] str;
}
};

int YString::length() {
return len;
}
ostream &operator <<(ostream &rcout, YString &src) {
rcout<<src.str;
return rcout;
}

int main() {
YString test1("What's this?");//변환생성자
cout<<test1<<"입니다."<<endl;

YString test2="가자";
cout<<test2<<endl;
return 0;
}

위와 같이 문자열을 다루는 YString 클래스에서 test2에 문자열을 대입했을 때, 기본형이 다음과 같은 생성자가 호출되어야 하는데,

YString(const char* src)

에러가 발생합니다.

YString test2="가자";

라는 구문에서 왜 변환생성자 YString(const char* src)가 호출되지 않나요. 호출돼야 하잖아요?

익명 사용자의 이미지

아니요 호출돼야 하는게 아닙니다.
operator=()은 생성자가 아닙니다.

dltkddyd의 이미지

YString(const char* src)가 호출돼야하는 것으로 보이는데요. operator=()을 말하는 것이 아니라요.

인수가 하나인 생성자는 변환생성자로 역할을 하며, 묵시적인 형변환이 돼야 하는 것으로 알고 있습니다.

YString test2="가자";

라고 했다면, 이 구문은 다음과 같이 해석되어 생성자가 호출돼야 한다는 것이 제 생각입니다.

YString test2("가자");

포인터 아닌 기본형에 대해서는 위와 같은 묵시적인 형변환이 허용되는데, 포인터는 원칙적으로 안되는 것인가요? 안된다고 한다면 이런 것은 어떻게 가능한가요?

string temp="가자";

분명 "가자"라는 문자열은 포인터 상수를 반환할 것이고, 묵시적인 형변환을 통해 포인터 상수 하나를 인자로 받는 string 클래스의 변환생성자가 호출될 텐데요. 이거 원칙적으로 앞뒤가 맞지 않고, 제 뇌가 도저히 이해할 수 없습니다.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

peecky의 이미지

우분투에 설치된 g++ 4.3 으로 해당소스를 컴파일 해봤습니다.

y.cpp: In function ‘int main()’:
y.cpp:59: error: no matching function for call to ‘YString::YString(YString)’
y.cpp:22: note: candidates are: YString::YString(YString&)
y.cpp:16: note: YString::YString(const char*)
y.cpp:11: note: YString::YString()

질문하신 부분에 에러가 났습니다.

String::YString(YString&) 부분을 삭제하니 컴파일이 되고, 제대로 동작하였습니다.

다시 원본으로 되돌려서, YString::YString(YString&) 부분을 YString::YString(const YString&) 으로 바꾸니 컴파일 및 동작이 제대로 되었습니다.

이유는 정확히 설명을 못하겠네요.
다만 레퍼런스 타입(YString &)으로 파라메터를 받을 때는, 함수 내에서 파라메터 원본을 바꿀 의도가 아닌 이상 const는 항상 써 주는게 좋습니다.

dltkddyd의 이미지

이유야 어찌됐건 말씀하신 대로 하니 컴파일 되고, 문자열 변환도 되네요. 그런데 const char*와 char*에 따라 컴파일이 되고 왜 안되고 그러는지 이해가 안되네요. 컴파일러 버그일까요? 아니면 ~~ . 아, 또 머리가 아파지네요.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

dltkddyd의 이미지

YString이었죠?

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.