음악, 삶, 개발

class 본문

개발 공부/C++ 약점공략

class

Lee_____ 2020. 9. 21. 00:50

 


생성자, 연산자 오버로딩 방식과 상황에 따라 호출되는 생성자, 연산자

< 용어 >

생성자 : constructor

기본 생성자 : default constructor

복사 생성자 : copy constructor

이동 생성자 : move constructor

연산자 : operator

대입 연산자 : assignment operator

이동 대입 연산자 : move assignment operator

파괴자 : destructor

 

위에서 보다시피, 영어가 한글보다 훨씬 길기에, 그냥 한글로 사용하겠다.

일단 아래의 그림을 머리속에 박제하도록한다.

이해는 나중에 해도 된다.

상황에 따라 어떠한 생성자와 어떠한 연산자가 호출되는지 외워야한다.

위의 생성자나 연산자중, 뒤에 noexcept 가 붙어야하는것들이 있는데,

일단 noexcept 를 배우지않았으므로 추후 공부하도록 한다.

또한 파괴자에 대해서도 알아야하는데, 대부분의 클래스는 파괴자를 필요로 하지않으므로, 일단은 패스.

(추후 배워야하는 순간이 올것이다.)

이동 생성자와 이동 대입연산자는 const Channel& other 가 아닌, Channel&& other 임을 잊지말라.


push_back vs emplace_back

vector 의 기능이지만, class 와 깊은 연관이 있어 여기서도 다시 다룬다.

 

push_back : 객체를 인자로 넘김.

emplace_back : 매개변수를 인자로 넘김.

 

아래 코드에서는 push_back emplace_back 을 각가 2번씩 호출하고,

생성자파괴자가 어떻게, 얼마나, 누가 호출되는지 콘솔로 찍어보았다.

 

위의 코드를 보면,

push_back 2번 호출 : 생성자 또는 파괴자 8번 호출

emplace_back 2번 호출 : 생성자 또는 파괴자 4번 호출

 

왜 이렇게 되는지에 대해서는, vector 포스트에서 다루도록 한다.

일단 emplace_back 이 무언가를 덜 호출하는것이다.

그럼 왜 push_back 을 써야하는지에 대해 궁금했다.

언제나 emplace_back 을 쓰는게 좋지않을까?

 

답변 : Why would I ever use push_back instead of emplace_back?

동영상 : youtu.be/_utkragEjRA?t=829

동영상 : C++ 벡터 push_back() 쓰지마세요.

 

위의 동영상 코드

push_back 은 implicit constructor 를,

emplace_back 은 explicit constructor 를 호출한다고한다.


C++ 이동 생성자(move constructor), 이동 대입 연산자(Move assignment operator)

C+11 우측값 참조와 이동 생성자

C+11 이동생성자 (Move Constructor)

C++11의 새로운 기능 : 이동생성자(move semantics)와 rvalue참조자

[c++] std::move와 std::forward