08년도에 구입해서 앞부분은 최소 4번이상 읽었으니 우려먹을만큼 우려먹은 책이다..
앞부분은 기본적인 내용뿐이고, 이미 알고있는 내용이 8할이다. 때문에 남은 2할때문에 다시보는 일을 피하고자 2할부분만 정리해 놓고자 한다.
각설하고, 시작하자.
1-1 printf()와 scanf()를 대신하는 입/출력 방식
- endl을 출력하는 경우 추가로 출력버퍼를 비우는 효과도 얻게 된다.
- <iostream.h>과 <iostream>의 차이는 C++표준에 존재하던 일부 내용이 변경되었고, 구버전의 헤더파일과 신버전의 헤더파일 구분을 뜻한다.
- cin에서 input data간의 경계는 공백(탭, 스페이스바, 엔터)에 의해 나눠진다.
- C컴파일러는 호출하고자 하는 함수를 찾을 때 오로지 함수의 이름 정보만을 가지고 찾는다. 하지만 C++컴파일러는 이름뿐 아니라 매개 변수의 정보까지도 참조한다.
- 리턴 타입만 달라서는 함수가 오버로딩되지 않는다.
- 함수헤더가 'int func(int a=0)'과 같이 변수를 0으로 선언하는 것이 디폴트 매개변수
- 위와 같이 정의된 함수는 func() == func(0)이 같은 의미를 지닌다.
- 함수 선언이 함수 정의 이전에 존재하는 경우 디폴트 매개변수는 선언부에 놓여져야 한다.
- 'int func(int a=0)'함수와 'int func(void)'함수가 공존하게되면 func()호출시 Ambiguous 에러가 난다.
- 매크로(#)에 의해 전처리 과정에 의해 변경된 소스코드가 입력된다.
- C++기반 함수 in-line화 : 'inline int SQUARE(int x)' 이와 같이 사용한다.
- 매크로를 이용한 함수의 inline화는 전처리기에서 일어난다.
- 키워드 inline을 이용하면 컴파일러에 의해 처리된다. (컴파일러판단에 따라 성능 저해로 판단되면 inline화를 무시하기도 한다.)
- 'namespace 이름 {}'으로 특정 영역(공간)의 범위를 지정하고 이름을 붙여준다.
- 이름공간(namespace)이 다르면 같은 이름의 변수나 함수의 선언이 허용된다.
- 이름공간::함수명(혹은 변수명)으로 접근 가능
- 'using namespace 이름;'을 통해서 ::접근 없이 특정 이름공간을 사용할 수 있다.
- 전역변수에 대한 접근의 경우 '::변수명'으로 접근이 가능하다.(지역변수에 같은 이름의 변수가 존재하는 경우 유용)
2-1 들어가기에 앞서서
Const 위치에 따른 의미 파악
:const int n=10;의 경우 n의 값은 상수로 취급되어 n의 값은 더이상 값의 변경이 불가하다.
지칭대상 변경여부 지칭대상의 값 변경여부
const int* n; O X
int* const n; X O
const int* const n; X X
2-2 bool 자료형
- 최근 표준에서는 bool자료형이 C언어 표준에도 포함되었다.
2-3 Reference의 이해
- 레퍼런스의 선언 : int &ref = val (val이 int형 변수라 가정)
- 레퍼런스 선언이란 이름이 존재하는 메모리 공간에 하나의 이름을 더 부여하는 행위
- 레퍼런스와 변수는 생성되는 방법만 차이 있을뿐 생성된 후에는 완전히 같은것이다.
- 레퍼런스는 선언과 동시에 반드시 초기화 시켜줘야 한다.
- 포인터를 이용한 Call-by-Reference, 레퍼런스를 이용한 Call-by-Reference
- 포인터를 이용한 경우 : 함수호출부를 보고 Call-by-Ref 인지 확인 가능, 잘못된 포인터연산으로 에러발생.
- 레퍼런스를 이용한 경우 : 함수호출부만 보고 Call-byRef 파악불가, 주소값연산걱정이 없다.
2-5 레퍼런스를 이용한 성능 향상
- Call-by-Value의 경우 매개변수의 메모리를 새로 할당하기 때문에 매개변수의 용량이 큰 경우 부담될 수 있다. 이런 경우 레퍼런스로 받게되면 메모리 성능을 향상시킬 수 있다.
- 레퍼런스를 사용하는 경우 실수로 함수 내부에서 값의 변경이 일어난 경우 프로그램전체에 영향을 미칠 수 있다. 이런 경우을 예방하기위해 매개변수를 const로 받아오면 된다. : 'void showData(const Person &p)' Person은 덩치가 큰 Class
- 레퍼런스와 타겟 변수는 완전 같기때문에 똑같이 사용하면 된다.
- 단, 지역변수는 레퍼런스로 리턴해 줄 수 없다.(지역변수는 함수의 종료와 함께 사라지기 때문이다.)
- C++에서 new 연산자가 메모리 할당에 실패했을 경우 bad_alloc 예외를 발생시킨다. (구체적인 설명은 13장에서...)
댓글 없음:
댓글 쓰기