티스토리 뷰
Class를 생성할 때, 컴파일러는 기본적으로 생성자, 소멸자, 복사 생성자, 복사 대입 생성자를 자동으로 생성하게 된다.
class Empty(){
public:
Empty(){ }
~Empty() { }
Empty(const Empty& rhs) { }
Empty& operator=(const Empty& rhs) { }
}
Empty e1; // 기본
Empty e2(e1); // 복사
e2 = e1; // 복사 대입
이렇게 자동으로 생성되는 코드는 예상치 못한 오류를 일으킬 수 있습니다. 예를 들어 가상 소멸자가 생성되어야 하는데
비가상 소멸자가 생성된다던가, 몰래 만들어진 복사 생성자로 인해 객체가 예상치 못한 작동을 할 수도 있죠. 고로 이러한 함수들은 막거나, 직접 생성하여야 합니다. 이 내용은 항목 6으로 이어지게 됩니다.
class Empty(){
public:
Empty(){ }
~Empty() { }
private:
Empty(const Empty& rhs) { }
Empty& operator=(const Empty& rhs) { }
}
다음과 같이 사용하지 않은 기본 함수들을 private에 넣어서 사용을 막을 수 있습니다.이렇게 넣어두면 복사를 하려고 복사 생성자를 호출하려고 할 때, private로 막혀있기 때문에 오류가 발생하게 되죠. 고로 이상한 행동을 막을 수 있게 된 것입니다. 이는 다음과 같이도 사용할 수 있습니다.
class Uncopyable{
protected:
Uncopyable() { }
~Uncopyable() { }
private:
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable&);
}
// 이렇게 되면 복사 생성자, 복사 대입 연산자 모두 선언되지 않습니다.
class HomeForSale : private Uncopyable{
...
}
'프로그래밍 언어 > Effective C++' 카테고리의 다른 글
항목8) 예외가 소멸자를 떠나지 못하도록 붙들어 놓자 (0) | 2023.04.25 |
---|---|
항목19) 클래스 설계는 타입 설계와 똑같이 취급하자 (0) | 2023.04.10 |
항목3) 낌새만 보이면 const를 들이대 보자! (0) | 2022.10.06 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 학교
- STL
- 알고리즘
- 더블버퍼링
- 드림핵
- 정보보안
- queue
- 인제대학교
- 보안
- Dreamhack
- Select모델
- 멀티쓰레드
- 개발
- 워셜알고리즘
- 고양이
- c++
- 자료구조
- 컨퍼런스
- 링크드 리스트
- 시스템보안
- 지뢰찾기
- 스레드풀
- 백준
- 야경
- BFS
- 레지스터
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함