c++
컴파일 관련
- 미리 컴파일된 헤더를 사용하자
- 다른 클래스를 참조한다고 하면 헤더 파일에는 전방선언하고,
cpp에서는 헤더 추가하자. 이때 헤더에서는 외부클래스의 객체는 동적할당만 가능하다.
const 레퍼런스 타입반환
-
const 레퍼런스 타입으로 객체를 반환해서 레퍼런스 타입으로 받게 되면,
수명연장 문제, 기존 객체 삭제 시에 새롭게 만든 객체는 사용 불가능하다.
-
int형이나 기본 데이터의 경우 value 값으로 반환하자.
굳이 할 필요는 없다.
라이브러리 관련
: 공용으로 사용되는 친구들은 모두 라이브러리로 옮기자.
변수
1.전역변수
- 전역으로 사용하던 unsing namespace std; 사용하지 말자!
- 전역변수를 여태까지 파일 상단에 초기화를 진행했지만, 옳지 못한 방법이다.
레퍼런스를 반환하는 함수에다가 초기화를 하고,
static 변수를 필요로 할때 이 함수를 호출하는 방식으로 진행하자.
https://velog.io/@kwt0124/1%EC%9E%A5.-c%EC%97%90-%EC%99%94%EC%9C%BC%EB%A9%B4-c%EC%9D%98-%EB%B2%95%EC%9D%84-%EB%94%B0%EB%A6%85%EC%8B%9C%EB%8B%A4
2.클래스의 멤버 변수
- 클래스의 멤버 변수는 m_ 키워드를 붙이자.
- 함수내에 들어오는 변수들을 구분하자.
- 변경되지 않는 변수들은 const data & // const 레퍼런스 타입으로 지정하고, 명칭은 in_ 키워드를 붙여서 입력으로만 들어오는 파라미터 라는 것을 나타내자.
- 함수 내에 들어와서 변경되는 변수의 경우에는 레퍼런스 타입으로 받고,
out_ 이라는 키워드를 붙여서 변경되는 파라미터임을 나타내자.
=> 레퍼런스를 통해 복사를 방지하자!
함수
- 멤버들의 변수 변경을 막기 위해서는 const를 함수명 뒤에 사용하자.
포인터 사용
- new ~ delete는 생성자와 소멸자에서
but, 스마트 포인터 사용을 권장하자.
-> 오브젝트의 크기가 크지 않다면 멤버 오브젝트로 선언해서 사용하자.
초기화
- {} : uniform initialization을 사용해서 초기화를 엄격하게 하자.
이유로는 인자로 호출되는 생성자와 데이터형이 다르면 컴파일 오류를 발생시킨다.
클래스
- 생성자는 explicit을 통해 변환 생성을 방지하자.
- 이니셜라이저를 사용해 초기화를 진행하자.
- 클래스의 메모리를 절약하기 위해서 가장 큰 멤버 변수의 사이즈에 맞춰서 멤버 변수들을 정돈하도록 하자.
- 병렬프로그래밍은 아니지만, 대비해서 alignas() 키워드를 사용하거나,
클래스 한개의 크기를 32바이트나 64바이트의 크기로 맞추도록 하자.
- 클래스 내에서 포인터를 사용한 리소스 관리는 최대한 피하자.
- 소멸자 뒤에는 noexcept 키워드를 붙이자.
- 복사, 이동, 복사대입, 이동대입 생성자 호출을 막기 위해
public에 선언하고, delete를 붙이자.
- get, set 할때 추가적으로 get 함수 뒤에는 const를 붙여서 스코프 이내의 값이 변경되는 것을 방지하고, set 함수는 const 레퍼런스 타입으로 반환함으로써 복사를 방지하자.
상속, 의존, 등등
- 추상클래스에서는 virtual 함수 선언만하자
- 추상클래스에서 소멸자는 반드시 virtual키워드 붙이자.
- 추상 클래스에서는 멤버 변수 사용 금지!, 일반 함수도 금지!
- 다른 클래스에 접근한다면 #include보다는 전방선언과 friend를 이용하자.
https://velog.io/@kwt0124/10.4-%EC%84%9C%EB%A1%9C%EB%A5%BC-%EC%B0%B8%EC%A1%B0%ED%95%98%EB%8A%94-%EC%A0%9C%ED%9C%B4-%EA%B4%80%EA%B3%84
클래스 설계
- cpp와 헤더에서 헤더에는 전방선언, cpp 에서는 #include를 사용하자.
- 하나의 부품을 나타내는 클래스가 있다면 따로 클래스를 만들어서 사용하자.
예를 들면 좌표를 나타내는 클래스가 있따. 절대 추상 클래스 내에 넣지 말자!
- 부모내의 멤버 변수를 파생 클래스에서 set할 경우에는 protected를 활용하자. 부모내의 함수 사용하는 것이 많으면 오버헤드 증가하고, set함수를 계속해서 늘려야 하기 때문에 비효율 적이다.
stl
- vector
- emplace_back으로 추가하자.
- reserve()를 통해 메모리를 미리 확보하자.
- erase 사용을 줄이고, 만약 몬스터 제거 시에는 불변수로 렌더되지 못하게 처리하자.
초기화는
- 이니셜라이저를 사용
- 상속 클래스에 대해 초기화
- () 보다는 {}는 사용하자