inflearn logo
강의

Course

Instructor

Minimum C++ for C developers

Temporary Objects and Invisible Copy Construction

생성자 궁금한거 있습니다

Resolved

218

choogang1218

1 asked

0

#include <iostream>

using namespace std;

class MyClass {

public:

MyClass(int a) : m(a) {

cout << "base" << endl;

}

MyClass(const MyClass& rhs) : m(rhs.m) {

cout << "copy" << endl;

}

~MyClass() {

cout << "delete:" << m << endl;

}

void print() {

std::cout << m << std::endl;

}

private:

int m;

};

MyClass test(MyClass rhs){

return rhs;

}

int main() {

MyClass a = 10;

MyClass b = MyClass(50);

MyClass c = a;

return 0;

}

결과로 base, base, copy, delete: 10, delete: 50, delete: 10이 출력됐습니다.

[질문]
MyClass a = 10;

MyClass b = MyClass(50);

이 둘의 차이가 무엇인가요? 특히 MyClass b = MyClass(50);의 base만 출력은 이해가 되지 않습니다.
일단 임시객체를 만들었으니 base, 그리고 임시객체를 const MyClass& rhs의 인자로 넘겨줘서 copy, 그리고 다음줄로 넘어가면 쓸모없어진 임시객체 MyClass(50)이 삭제되서 delete 이렇게 3개가 출력될줄 알았는데 base만 출력돼서 이해가 되지 않습니다.. (이 부분은 찾아보니까 복사 엘리전이라고 하는데 맞나요?? 그래서 복사 생성자를 안쓴다는데 헷갈리네요 ㅠㅠ)
그리고

MyClass b = MyClass(50);

MyClass c = a; 이 둘의 차이도 알고싶습니다.

b,c 둘다 객체를 인자로 받고있습니다. 근데 b는 base를 출력하고 c는 copy를 출력합니다. 왜 b가 base를 출력하나요? 이와같은 복잡함을 덜기위해 explicit를 사용하는건가요?



c++ microsoft-windows 객체지향 디자인-패턴

Answer 2

0

nullnull8537

인프런 AI 답변을 참고하시면 되겠습니다. 고맙습니다. 😄

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다.

MyClass a = 10;MyClass b = MyClass(50);의 차이에 대해 설명드리겠습니다.

첫째, MyClass a = 10;는 암시적 변환 생성자를 호출하여 int 형태의 리터럴 10MyClass 타입의 객체로 변환합니다. 이 과정에서 MyClass(int a) 생성자가 호출되어 base가 출력됩니다.

둘째, MyClass b = MyClass(50);는 명시적으로 MyClass 타입의 임시 객체를 생성하고, 이 임시 객체를 b로 초기화합니다. 여기서 “복사 엘리전(copy elision)” 또는 “임시 객체 생략” 최적화가 발생할 수 있습니다. C++ 표준에서는 컴파일러가 임시 객체의 복사 또는 이동을 생략하도록 허용하고 있어, 복사 생성자 호출 없이 바로 base가 출력됩니다. 이 최적화가 발생하여 MyClass(50)으로 생성된 임시 객체가 바로 b 객체로 초기화되면서 복사 생성자 호출 없이 base만 출력된 것입니다.

MyClass b = MyClass(50);MyClass c = a;의 차이는 다음과 같습니다.

  • MyClass b = MyClass(50);: 위에서 설명한 바와 같이, 임시 객체를 생성하고 이를 b로 초기화합니다. 이 과정에서 복사 엘리전에 의해 복사 생성자 호출 없이 바로 객체가 생성됩니다(base 출력).
  • MyClass c = a;: a 객체를 사용하여 c를 초기화하는 과정에서 복사 생성자가 호출됩니다. 이는 a가 이미 초기화된 객체이며, 복사 생성자를 통해 ca의 상태를 복사합니다(copy 출력).

복잡함을 줄이기 위해 explicit 키워드를 사용하는 경우는, 클래스의 생성자가 암시적 변환을 허용하는 것을 방지하기 위함입니다. 예를 들어, 생성자 앞에 explicit을 명시하면 MyClass a = 10;와 같이 암시적 변환을 통한 객체 생성이 금지됩니다. 이는 개발자가 의도치 않은 변환으로 인한 오류를 줄이고자 할 때 유용합니다.

explicit을 사용하면, 객체 초기화 시 의도하지 않은 변환을 방지하여 코드의 명시성을 높일 수 있습니다.

인터페이스 상속과 추상 자료형 2:00 질문

0

50

1

13분 42초의 예제

0

52

2

네임스페이스 스코프 내에서 정의된 변수, 함수들이 위치하는 곳 질문

0

46

1

소멸자 가상함수 질문

0

55

2

이동생성자의 매개변수로 넘어가는 임시객체의 값 유지 관련하여 질문이 있습니다.

0

63

2

임시 객체 복사 생성자 질문드립니다

0

66

2

변수 바인딩에 대한 의문점

0

113

1

C++ 파일 구조 질문

0

128

1

빈 포인터에 멤버함수 호출

0

104

1

파생클래스에서 virtual함수를 선언에 대한 질문입니다.

0

116

2

순수 가상 클래스 선언과 일반 인트 변수의 선언과 다른가요?

0

137

2

안녕하세요. 이동의미론에 대해 제가 잘 이해했는지 궁금합니다.

0

132

1

인스턴스의 개념에 대해 int a(3), int(5) 예시를 바탕으로한 질문입니다.

0

189

2

식별자 검색 순서 관련 namespace 생략 관련 오류에 관한 질문

0

175

1

마지막 주소록 예제 c 파일 한글 깨짐 현상

0

190

1

nullprt vs null

0

153

2

쓸데없지만 질문드리고싶습니다

0

181

1

복사 생성자 질문 드립니다.

0

221

1

단순대입 오류 발생 이유

0

235

1

네가지 형변환 강의 질문

0

283

1

CMyString Step10 강의 질문

0

174

1

임시 객체와 보이지 않는 복사 생성 강의 질문

0

268

2

섹션8 3번째 강의 (실습 프로젝트 - 문자열 필터개선) 질문

0

219

2

차이점을 잘 모르겠습니다.

0

233

1