연산자 오버로딩 관련 질문입니다.
글쓴이: Era / 작성시간: 토, 2021/01/02 - 4:05오후
#include<iostream> #include<string> using namespace std; class Person{ private: string name; public: Person(){ name = "Bob";} Person(string name){this->name = name;} //Person operator + (const Person &other){return Person(name + "&" + other.name);} Person operator + (const Person &other){Person(name + "&" + other.name);} void showName(){ cout << "이름 : " << name << endl;} }; int main(void){ Person person1; person1.showName(); Person person2("Alex"); person2.showName(); Person result = person1 + person2; //연산자 오버로딩에서 사용한 연산자를 이용해서 정의한다. nb1 + nb2 = nb1.operator+(nb2) result.showName(); return 0; }
위코드에서
Person operator + (const Person &other){Person(name + "&" + other.name);}
에 return을 붙이지 않았는데 이때 결과가 Alex로 출력되었습니다.
return없이 연산자 오버로딩으로 생성자를 정의한 경우에, nb1의 결과가 반영되지 않는 과정이 궁금합니다.
Forums:
짜잔. Undefined behavior 당첨입니다.
짜잔. Undefined behavior 당첨입니다.
함수 Person::operator+는 Person을 반환해야 하는데, 그러지 않고 flowing off 되었을 경우 Undefined behavior가 발생합니다.
Undefined behavior가 발생한 프로그램에서는 신비한 과정을 통해 신비한 일이 일어날 수 있습니다.
그런 프로그램을 만들지 마세요.
감사합니다...!
그럼 말씀하신 Undefined behavior가 발생하면, 일정한 결과가 아닌 예측 불가능한 결과값만 나오게 되는 것인가요?
예측 불가능한 결과가 일정하게 나올 수도 있고요.
예측 불가능한 결과가 일정하게 나올 수도 있고요.
현실적인 관점에서 볼 때, Undefined behavior (이하 UB)가 발생했다고 해서 컴파일러나 실행 환경이 부조리할 정도로 변덕스럽게 동작하도록 만들어지지는 않습니다. 대개 그런 경우를 신경쓰지 않고 만들어질 뿐이죠.
그러니 어떤 결과가 나왔다면 왜 그 결과가 나왔는지 거꾸로 추적해서 분석해 볼 수 있기는 합니다.
하지만 C++언어를 사용하는 입장에서의 가이드라인은 분명합니다. UB를 일으키지 마세요.
예측 불가능이라기보다는 사용하는 컴파일러마다 결과가
예측 불가능이라기보다는 사용하는 컴파일러마다 결과가 다릅니다.
Undefined behavior라는게 스팩에는 정의가 없으니 컴파일러 만드는 사람이 알아서 만드는 것이거든요.
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
댓글 달기