일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- leetcode 234
- leetcode125
- leetcode 344
- Hadoop
- 머신러닝
- docker로 airflow 설치하기
- 문자열 조작
- webcrawler
- leetcode 561
- leetcode 937
- 컴퓨터구조
- leetcode 238
- 스파크 완벽 가이드
- leetcode
- 올바른 변수명 짓기
- airflow docker
- leetcode 49
- ctf-d
- leetcode 819
- Python
- 배열
- leetcode 121
- leetcode 5
- 빅데이터를 지탱하는 기술
- MapReduce 실습
- Hortonworks Sandbox
- 블로그 이전했어요
- wargame.kr
- leetcode 15
- 데이터레이크와 데이터웨어하우스
- Today
- Total
HyeM
More Effective C++ 본문
More Effective C++
목차
CHAPTER 1_ 기본 개념들 항목1 . 포인터(pointer)와 참조자(reference)를 구분하자. 항목2 . 가능한 C++ 스타일의 캐스트를 즐겨 쓰자. 항목3 . 배열과 다형성을 같은 수준으로 놓고 볼 것이 아니다. 항목4 . 쓸데 없는 기본 생성자는 그냥 두지 말자. |
CHAPTER 2_ 연산자 항목5 . 사용자 정의 타입변환 함수에 대한 주의를 놓지 말자 항목6 . 증가 및 감소 연산자의 전위/후위 형태를 반드시 구분하자 항목7 . &&, ||, 혹은 . 연산자는 오버로딩 대상이 절대로 아니다 항목8 . new와 delete의 의미를 정확히 구분하고 이해하자 |
CHAPTER 1_ 기본개념들
항목1 . 포인터(pointer)와 참조자(reference)를 구분하자.
참조자 | 포인터 | |
NULL 참조여부(유효성검사) | x | o |
다른 객체 참조가능 여부 | x | o |
널테스트 여부 | x | o |
다른 객체를 참조할 수 있는가의 여부 | x(초기화 될때 참조했던 그 객체만 참조) | o(여러객체 참조가능) |
차이점1
참조자 : 널(NULL)참조가 없다. 참조자는 어떤 경우든지 메모리 공간을 차지한 객체를 참조하고 있어야 함.
그래서 객체를 참조하는 어떤 변수가 가리키는 메모리가 항상 유효한 객체이면 참조자 쓰기
SO, 참조자는 선언될때 반드시 초기화 해야함
유효성 검사 필요 x
포인터 : 초기화 하지 않아도 오케
유효성 검사 필요o
*널테스트(유효성검사) : 유효한 객체를 가리키고 있는지 검사함
포인터는 필요, 참조자는 필요 x
void printDouble (const double *pd)
{
if (pd){ cout<< *pd ; }//널 포인터인지 검사
}
차이점2 _ 다른 객체를 참조하게 할 수 있는가 의 여부
포인터는 다른 객체를 참조 가능 ( 다른 객체의 주소값으로 바꾸어 세팅 가능)
참조자는 놉, 할수 없음(초기화될 때 참조했던 그 객체만 참조가능)
string s1 = "a";
string s2 = "b";
string & rs = s1; //참조자
string & ps = s2; // 포인터
rs = s2; // rs 는 여전히 r1을 가리키지만, r1의 내용은 "b"이다.
ps = &s2; //ps는 이제 s1이 아닌 s2를 가리킨다.
참조자를 반드시 써야하는 특수한 상황
-> 연산자 함수를 구현할때
상황에 따라 구분을 하자면,
딱히 가리킬 객체의 주소 없을 때 , 하나의 변수를 가지고 여러개의 객체를 바꾸어 참조해야할때 -> 포인터
참조할 포인터가 처음부터 끝까지 존재할 것임을 알고 있을때(참조하고자 하는 어떤 객체를 미리 알고 있을 때), 참조하는 대상 객체를 바꿀 필요가 없을때 => 참조자
포인터를 사용하면 문법상 의미가 어색해지는 연산자를 구현할때 =>참조자
항목2 . 가능한 C++ 스타일의 캐스트를 즐겨 쓰자.
c 스타일 캐스트의 문제점
문제1 . 어떤 타입을 다른타입으로 아무 생각없이 바꾸어줌
어떤 객체의 상수성만을 바꾸는 캐스트, 객체타입을 완전히 바꾸는 캐스트 등
문제2 . 눈으로 찾아내기 힘들다
c스타일 캐스트의 문제를 보완하기 위한
c++스타일의 캐스트 연산자 4가지 도입
static_cast<타입>(표현식)
: 형변환 능력갖고 있는 기본적인 캐스트 연산자
단, 상수성을 떼어버리진 못함(const_cast로는 가능)
int a,b;
double result = ((doulbe) a) /b; //c스타일
double result = static_cast<double>(a)/b; //c++ 스타일
const_cast
:표현식의 상수성이나 휘발성을 없애는 데 사용
dynamic_cast
: 상속계층 관계를 가로지르거나 하향시킨 클래스 타입으로 안전하게 캐스팅할 때 사용
( 기본 클래스의 객체에 대한 포인터나 참조자의 타입을 파생클래스, 혹은 형제 클래스의 타입으로 변환해 줌)
상속계층구조를 오갈때에만 사용, 가상함수가 없는 타입에는 적용못함. 상수성제거에도 사용못함
reinterpret_cast
: 변환 결과는 거의 항상 컴파일러에 따라 다르게 정의됨.
가장 큰 용도는 함수 포인터 타입을 서로 바꾸는 것.
항목3 . 배열과 다형성을 같은 수준으로 놓고 볼 것이 아니다.
'Programming > C++' 카테고리의 다른 글
More Effective C++[항목21-24] (0) | 2020.03.16 |
---|---|
More Effective C++[항목16-20] (0) | 2020.03.10 |
More Effective C++[항목14] (0) | 2020.02.26 |
More Effective C++[항목13] (0) | 2020.02.24 |
More Effective C++ (0) | 2020.02.22 |