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
반응형