강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

조준수님의 프로필 이미지
조준수

작성한 질문수

홍정모의 따라하며 배우는 C++

9.1 산술 연산자 오버로딩 하기

적절한 생성자가 없습니다?

작성

·

1K

0

안녕하세요 이번 강의듣고 여러가지 실험하다가 알아내게된 사실인데요

위의 코드에서처럼 생성자가 없을시 저 리터럴값이 들어가지가 않더라고요. 이건 구글에 쳐봐도 제가원하는 답이안나와서...

사실 진짜로 알고싶은게 저 주석처리된 생성자를 풀면 코드에 에러가 사라지고 원래는 Test 클래스 객체만 받아야할 저 a 라는 함수가 리터럴값 뿐만아니라 다른 정수형도 받고 정상적으로 변수에 저장되기까지합니다...

이게 질문의 요지인데... 어떻게 이게 가능한건지 알고싶습니다. 문자의경우 아스키코드 값으로 저장이 되더라고요 

 

그리고 아래코드에서

using namespace std;

 

class over

{

int value;

public:

over(const int &value):

value(value)

{}

 

//1.

const int operator +(const over& ref)

{

return this->value + ref.value;

}

 

//3.

const int operator +(const int &num)

{

return value + num;

}

 

//2.

friend int operator+(int num, const over& ref)

{

return num + ref.value;

}

};

 

int main()

{

//1. 객체끼리의 연산

cout << over(1).operator+(over(2)) << endl;

cout << over(1) + over(2) << endl;

 

//2. 리터럴 + 객체

cout << 1 + over(1) << endl;

 

//3. 객체 + 리터럴

cout << over(1) + 1 << endl;

cout << 5 + over(2) + 4 + over(1) << endl;

}

코드 2번 리터럴 + 객체 를 구현하기위해 저 friend 붙은 함수를 구현해야 하잖아요.

궁금한게 저 부분이 잘 이해가 되지 않거든요

객체 + 리터럴 같은경우에는 내부적으로

.operator+ => 이게 + 로 컴파일 내부적으로 바꿔주기에 충분히 이해하였는데

그렇게 따지면 저 리터럴 + 객체부분은

설명이 안되더라고요.

말이 되려면 리터럴 이런것도 컴파일 내부적으로 객체취급해

서 가능하게끔 한다는 말이어야하는데...

그냥 외워야 될려나요??

 

그리고 코드 맨마지막줄의

cout << 5 + over(2) + 4 + over(1) << endl;

이부분에서요 총 + 가 3개가 있는데

원래대로라면 두번째 + 는

위 코드의 3번째 함수를 가리켜야 정상인데

아무것도 가리키고 있지 않습니다.

위 예시의 그 윗줄 코드인

cout << over(1) + 1 << endl;

여기서의 + 는 코드의 3번째 함수를 정상적으로 가리키고

있는데, 이것도 왜이런건지 잘 모르겠습니다...ㅠ

제가볼때는 원래 + 인거같은데

하지만 +를 오버로딩을 했는데....

흠 잘모르겠네요

질문이 장난아닌데;; 

답변주신 모든분들 감사합니다

퀴즈

사용자 정의 타입에 대해 연산자 오버로딩을 하는 주된 목적은 무엇일까요?

코드 실행 속도를 빠르게 하기 위해

사용자 정의 타입을 내장 타입처럼 자연스럽게 사용하기 위해

객체의 메모리 관리를 자동화하기 위해

클래스의 상속 관계를 정의하기 위해

답변 1

0

답변 늦은 점 죄송합니다 

1. a(111) 은, 그러니까  const Test& ref = 111; 은 곧

Test임시객체(111); 

ret = 위에서 만든 Test 임시객체;

과정과도 같습니다.  

링크 참고해주세요

 c++ - const reference of a class initialization - Stack Overflow

2. 이 부분은 질문이 이해가 잘 안되네요 ㅠㅠ 

"객체 + 리터럴 같은경우에는 내부적으로

.operator+ => 이게 + 로 컴파일 내부적으로 바꿔주기에 충분히 이해하였는데"

이게 어떤 말씀인지 모르겠습니다..!

디버깅 해보면 알 수 있는데 

리터럴 + 객체는 friend int operator+(int num, const over& ref) 가 호출되구요,

객체 + 리터럴은 const int operator +(const int& num) 가 호출됩니다. 

정수 리터럴에서 연산자 오버로딩이 호출되는건 아닙니다.

3. 

3번째 함수라면 어떤걸 말씀하시는건가요? friend int operator+(int num, const over& ref) 인가요?

"// 3." 이라고 써있는 cout << 1 + over(1) << endl; 인가.. 

이것도 디버깅 해보시면 알 수 있어요! 확인해보시길 바랍니다. :) 

조준수님의 프로필 이미지
조준수

작성한 질문수

질문하기