티스토리 뷰
면접 대비용으로 공부하면서 정리한거라 다소 두서가 없어 보일 수 있음.
1. 참조형 변수는 생성하자마자 초기화 해야함
예 int ace = 10;
int& son = ace;
1.1 참조를 한 변수 (위에서 son)를 변경하면 원본(위에서 ace)도 변경된다.
1.2 클래스 멤버 변수는 생성하자마자 초기화를 해주지 않아도 된다.
1.3 숫자와 같은 것들은 참조를 할 수 없다.
예 int& ronaldo = 7; --> 생각해보면 말이 안된다. 변경을 할 수가 없는데 어찌 참조하나
* 그대신 const 키워드가 있으면 가능하다 const int& ronaldo = 7 뭐 이런식으로 말이지.
1.4 참조형 변수는 한 번 선언할 때 초기화 되면 참조 대상은 절대 바뀌지 않는다. 단지 값만 바뀔 수 있다.
1.5 참조형 클래스 데이터 멤버
참조형 멤버는 생성자 초기화 리스트에서 만들어주어야 한다.(바디 말고)
ex) class Barcelona
{
public:
Barcelona(int& messi) : m_player(messi) {}
private:
int& m_player;
}
1.6 참조형 리턴값을 사용하는 이유는 효율성. 불필요한 복제 오버헤드 피함.
2. 참조와 포인터
2.1 참조가 할 수 있는일은 포인터도 할 수 있다. 다만 참조는 코드를 간결하게 만들어준다.
그리고 참조가 더 안전하다. 유효하지 않은 데이터를 가리키는 것이 불가능 하니까
2.2 참조 대신 포인터를 사용해야 할때는 가리키는 대상을 바꿔야 할 때와 파라미터에서 nullptr과 같은
디폴트 값을 지정해야 할때 사용한다.
2.3 결론적으로 참조 대상을 바꾸어야 할 필요성이 없으면 참조를 사용하는게 안전함.
3. rvalue 참조형 파라미터는 && 이다.
ex) void Run(int&& num)
{
++num;
}
뭐 이런 클래스가 있다고 가정하자.
int a = 123 , b = 454;
Run(a+b) 이런식(임시변수) 으로 함수를 불러야 한다면 rvalue 참조를 해주어야 한다.
또한 상수 구문도 rvalue 파라미터로 사용될 수 있다.
Run(1234) 이런식으로 말이다. 생각해보면 당연하다. 1234라는 숫자는 절대 좌변에 올 수 없다.
굳이 lvalue 값을 rvalue 파라미터에 호출을 하고 싶다면 std::move를 사용하면 된다.
ex) int b = 10;
Run(std::move(b)) ; --> 이런식으로 호출 할 수는 있음.
3.1 rvalue 참조가 항상 파라미터에만 이용되는건 아니다.
일반적인 변수들도 동일하게 적용된다.
ex) int& messi = 4; // 이건 당연히 안된다. 되게 하려면 const를 써주어야 함.
int&& messi = 4; // 이건 된다. rvalue 참조. 근데 굳이라는 느낌이 있긴 하다.
int soccer = 10 , int baseball = 34;
int& score = soccer + baseball // 이건 당연히 안된다. rvalue 참조니까
int&& score = soccer + baseball // 이건 된다.
'언어' 카테고리의 다른 글
C++ 초기화 (0) | 2019.06.06 |
---|---|
C++ 타입 그리고 캐스팅 방법 (0) | 2019.06.06 |
C++ 아주 헷갈리는 const 키워드 (0) | 2019.06.06 |
C++ 이동 시맨틱 (0) | 2019.06.06 |