음악, 삶, 개발
class 본문
생성자, 연산자 오버로딩 방식과 상황에 따라 호출되는 생성자, 연산자
< 용어 >
생성자 : 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의 새로운 기능 : 이동생성자(move semantics)와 rvalue참조자