C++ 노트

학교 강의를 들으면서 or 공부하면서 새롭게 알게 된 내용 정리.

1. 컴파일 시 xxx vs 런타임 시 xxx ( const 와 constexpr 에 대해)

- 컴파일 시 : 코드를 실행하기 전, 컴파일 과정에서 이루어져야(조건이 만족되야?) 한다.
ex) constexpr 의 경우 constexpr int x = 3 * a; <-- 처럼 a에 어떤 수가 들어올 지 모르기 때문에 빌드 시 오류가 발생한다.(즉, 컴파일 시 값을 알고 있어야 함.)

- 런타임 시 : 코드를 실행해서 프로그램이 돌아가는 과정에 조건이 만족되면 된다.
ex) const 의 경우 const int x = 3 * a; <-- 처럼 a에 어떤 수가 들어올 지 모르지만 실행과정에 알 수 있게 되므로 오류가 나지 않는다.(즉, 컴파일 시 값을 몰라도 됨.)

2.
1) 맵은 iterator로 for(auto& i : m) 를 통해 각 객체를 가져올 수 있다. i 에 pair가 담기게 됨.
2) cin의 EOF 처리 = while(cin >> s) 로 하면 EOF를 만나면 false를 반환한다.

3. 동적 메모리 할당

데이터타입* 포인터변수 = new  데이터타입
메모리 반납 : delete 포인터변수
delete 시 주의 사항
1) 할당받지 않은 메모리를 delete 시 오류
2) 이미 반환한 메모리를 다시 delete 시 오류

new 로 배열 초기화 시 int* arr = new int[5]{1,2,3,4,5} 와 같이 초기화한다.
(배열의 크기를 생략하면 안됨.)
n차원 배열을 동적할당 시 가장 높은 차원부터 낮은차원 순으로 할당, delete 시엔 반대의 순서로 반환한다.

int (*arr)[b] = new int[a][b]; --> x ( 왼쪽은 정적으로 표현되어야 함.)
int (*arr)[4] = new int[a][4]; --> o

4. 메모리 누수 체크

#ifdef DEBUG
#ifndef DBG_NEW
#define DBG_NEW new (_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DBG_NEW
#endif // !DBG_NEW
#endif

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
= iostream 헤더의 함수, main 함수에서 호출.

위 코드를 넣으면 실행 시 메모리 누수가 발생한 코드를 찾을 수 있다.

5. Class 관련

1) C++ 에서 Class 내부에 선언한 함수들은 모두 자동으로 인라인 함수가 된다.
-> 짧은 코드만 넣고, 따로 cpp파일에 함수를 정의하자.

2) class 내의 const함수
- const로 선언된 함수는 멤버 변수를 건드리지 못 한다.
- const 멤버 함수에선 const 멤버 함수만 호출할 수 있다.
- const 객체는 const 멤버 함수만 호출할 수 있다.
- const의 여부는 오버로딩의 새로운 조건이 된다.
->같은 이름의 멤버 함수도 const 객체는 const 멤버 함수를 호출한다.

3) friend 선언
- 클래스 내에서 다른 클래스를 friend로 지정할 수 있다.
- 클래스 내에서 다른 함수(다른 멤버 함수, 전역 함수 포함)를 friend로 지정할 수 있다.
- friend로 지정된 함수 or 클래스에선 자신을 friend로 지정한 클래스의 private 영역을 건드릴 수 있다.

4) static 멤버 변수, 멤버 함수
- 클래스의 멤버이지만 프로그램이 실행될 때 생성되고, 종료될 때 함께 사라진다.
- 해당 객체가 생성되기 전에도 접근이 가능하다.
- non-static 멤버 변수나 멤버 함수에 접근이 불가능하다.
->why? 해당 객체가 아직 생성되지 않았을 수 있기 때문에

댓글

이 블로그의 인기 게시물

HTML - input file 버튼 꾸미기

HTML - 이미지 미리보기(jQuery 없이)

BOJ - DNA 유사도(2612)