pointer vs reference (more effective c++ 01)
2015. 7. 21. 18:47ㆍ프로그래밍/Effective C++
728x90
728x90
기본용어
pointer - 포인터 "*",
포인터 연산 - "->"
reference - 참조자 "."
무엇이 다른가요?
참조자 개념엔 널 참조자(null reference)가 없다.
객체를 함조하는 어떤 변수가 가리키는 메모리는 항상 유효한 객체여야만 한다.
참조자를 썼다는 것은 그 변수가 널일 가능성을 완전히 배제할때 사용해야한다.
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 | // ConsoleApplication6.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다. // #include "stdafx.h" #include <string> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { // 에러 참조자는 반드시 초기화 해야한다. // string& rs; // 이게 안됐다면 std::나 using을 사용하자. string s("popura"); // coco는 s를 참조한다. string& coco = s; // 그냥 사용하면 된다. coco = "momo"; //초기화 되지 않는 포인터 string* ps; // 하지만 포인터는 new로 초기화 하지 못하면 사용할 수 없다. //ps = "mom"; return 0; } | cs |
널 체크
참조자와 다르게 포인터가 객체를 참조하기 위해
포인터가 유효한 객체를 가리키고 있는지를 검사해야한다.
1 2 3 4 5 | // 널체크 if (ps != nullptr) { // } | cs |
일반적으로 포인터를 사용해야 하는 경우
- 딱히 가리킬 객체의 주소가 없을 때.
- 하나의 변수를 여러 개의 객체를 바꾸어 참조할 때.
종합적으로 참조자는 언제 쓰나요?
- 참고하고자 하는 어떤 객체를 미리 알 고 있을 때.
- 다른 객체를 바꾸어 참조할 일이 결코 없을 때.
- 포인터를 사용하면 문법상 의미가 어색할 때.
3번째 문장 예제)
1 2 | vector<int> v(10); v[5] = 10; | cs |
여기서 operator[]가 포인터를 반환한다면?
*v[5] = 10; 같은 형태로 된다.
이는 마치 c가 포인터의 벡터인 것처럼 보이게 하는 어색함을 형성한다.
그러므로 분명히 operator[]는 참조자로 구현되었을 것이다.
1 | reference operator[](size_type _Pos) {...} | cs |
그래서 찾아봤는데 실제로 래퍼런스 타입으로 리턴을 한다.
이 세 경우를 제외하면?
무조건 포인터.
728x90
반응형
'프로그래밍 > Effective C++' 카테고리의 다른 글
#define 안녕(effective c++ 02) (0) | 2015.07.27 |
---|---|
C++은 연합체로 바라보자(effective c++ 01) (0) | 2015.07.27 |
객체 복사(effective c++ 12) (0) | 2015.07.26 |
(작성중)배열 vs 다형성(more effective c++ 03) (0) | 2015.07.25 |
C++ 캐스팅(more effective c++ 02) (0) | 2015.07.25 |
객체 초기화(effective c++ 04) (0) | 2015.07.24 |
private 상속에 대하여(effective c++ 39) (0) | 2015.07.19 |