| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 프로그래머스
- 1563
- 오블완
- NRVO
- const
- UnrealEngine5
- baekjoon
- Programmers
- IFileDialog
- Effective C++
- C++
- UE5
- UnrealEngine4
- winapi
- DirectX11
- 2294
- RVO
- TObjectPtr
- C
- softeer
- 언리얼엔진5
- algorithm
- 팰린드롬 만들기
- 백준
- 줄 세우기
- Unreal Engine5
- GeeksForGeeks
- directx
- RootMotion
- 티스토리챌린지
- Today
- Total
목록Effective C++ (6)
Game Develop
참조자로 전달하는게 대개 나은 이유중 대표적인 이유가, 값에 의한 전달을 하면 복사비용이 크기 때문이다.아마 이정도는 조금이라도 C++을 공부한 분들이시라면 꽤나 잘 알려진 내용이다.매개변수로 전달되는 객체를 읽기전용으로 쓸거면 안전하게 const까지 붙여서 전달받는게 베스트이다. 그리고 책을 보면 참조자로 전달해야만 하는 케이스가 또 있는데, 사실 많이 발생하는 이슈일 것 같진 않지만 이런쪽으로 생각 해 본적은 없었어서 한번 남겨본다. 대충 Parent와 Parent를 상속받는 Child가 있다고 가정하고... bool Validate(Parent p); 라는 함수도 있다고 가정하자. 그리고 특정함수에서 아래와 같은 코드를 작성해보자. Child c;Validate(c); 자 여기엔 무슨 문제가 있..
객체를 복사해야 하는 경우(복사생성이나 대입연산), 말 그대로 모든 부분을 빠짐없이 복사해야 한다. 상속관계인 두 클래스가 있을 때, 자식클래스에서 복사생성을 정의할 경우 부모클래스의 복사생성은 호출되지 않는다.물론 따로 정의 안하면, 기본컴파일러가 부모것까지 얕은복사를 해준다. 자 그러면 여기서 자식클래스에서 복사생성자랑 대입연산자를 정의해보자. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970#include iostream>#include string> using namespace std; class Paren..
여기서 말하는 자기대입(self assignment)란, 어떤 객체가 자기 자신에 대해 대입연산자를 적용하는 것을 의미한다.대충 아래처럼? Widget w;w = w; 이게 왜 위험한가... 아래의 예시코드를 먼저 보자. 123456789101112131415161718 class Bitmap {}; class Widget{ public: Widget& operator= (const Widget& rhs) { delete pb; pb = new Bitmap(*rhs.pb); return *this; } private: Bitmap* pb;};Colored by Color Scriptercs 위의 예시코드는 안전하지 않은 대입연산자 코드이다.왜..
사실 Effective C++이라는 카테고리를 따로 걸어서 뭔가 올리고 있긴 한데, 다른 내 글들과 마찬가지로 사실상 숙지용? 글에 가깝다.책처럼 보기 좋게 쓰여진다기 보다는, 공부하다 혼잣말 하는 느낌의 글이라 생각한다.어차피 Effective 시리즈 관련 정리 글은 다른 분들이 잘 정리해서 올려주신게 많기 때문에... === === === === === === === === === === === === === === === === === === === === === === === === === === 부모와 자식클래스가 있고, 부모클래스에서 Test() 라는 가상함수를 선언했다고 가정해보자.그리고 자식에서는 그 가상함수를 오버라이드해서 뭐 이것저것 작성했고.그다음 이 가상함수를 부모의 생성자에서 ..
어떤 객체의 인스턴스한테 유일성을 보장해주고싶을 때가 있다고 가정해보자.그러면 인스턴스를 만들면 그것과 동일한게 있으면 안되니 복사생성자나 복사대입연산자를 허용하면 안된다. 이럴 때 먼저 가장 손쉬운방법은 복사생성자나 복사대입연산자를 private으로 선언해버리는 것이다.private이니 외부에서 호출할 수 없게 만들어버렸다는 느낌이다. 하지만 이 방법은 100% 완벽하지 않다.왜냐면 클래스의 멤버함수나 프렌드함수에서 해당 복사생성자나 복사대입연산자를 호출해버릴수도 있기 때문이다. 멤버함수에서의 호출까지 막을려면 그냥 복사생성자, 복사대입연산자를 '선언'만 하는 것이다.실제로 이 방법은 C++의 iostream 라이브러리의 몇몇 클래스에서 실제로 적용한 복사방지법이라고 하니, 필요할 때 써먹어도 될 것 ..
제목을 다시 바꿔말하면.. 멤버 초기화 리스트를 사용해 멤버변수들을 초기화하자. C++규칙에 의하면 어떤 객체이든 그 객체의데이터 멤버는 '생성자의 본문'이 실행되기 전에 초기화되어야 한다고 명시되어있다. Foo::Foo(const string& name, const int count) { this->m_Name = name; this->m_Count = count; } 위 코드에서 멤버변수들은 초기화되었는가? 아니다. '생성자의 본문'이 실행되기 전에 초기화 되어야 한다고 되어있는데, 위 코드는 본문에서 멤버변수에 '대입'을 했을 뿐이다. 그리고 좀 더 정확히는 저 대입연산을 하기전에 멤버변수들의 기본생성자들이 호출되어서 값을 초기화했을 것이다.근데 m_C..