C++ Chapter 6.14 : 참조와 const

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


int x = 5;
int & ref = x;

x가 메인이고 ref는 x의 별명일 뿐임을 인지하자.


int x = 5;
const int & ref = x; // ⭕ 가능 : ref를 통해 x값을 수정하는건 안되고 읽기만 가능

const int x = 5;
int & ref = x; // ❌ 불가능 : ref 가 상수인 x 값을 수정할 우려 때문에

const int x = 5;
const int & ref = x; // ⭕ 가능 : const가 붙으면 ref 가 참조 대상인 x 값을 수정 못하니까 우려가 사라지므로.

const int x = 5;
const int & ref = x;
const int & ref2 = ref; // ⭕ 가능 : 참조 변수가 또 다른 참조 변수를 참조하는것 가능. x의 별명은 ref, ref2 2개가 된다.

int x = 5;
int & ref = x;
const int & ref2 = ref; // ⭕ 가능 : ref2로는 x의 값을 바꾸는 것이 불가능하지만 ref로는 x의 값을 바꿀 수 있다.

const포인터와 const참조의 소소한 차이

int a = 3;
int b = 7;

int * ptr1;
const int * ptr2 = &a;

ptr1 = ptr2;  // ⚡⚡에러⚡⚡ 
// const int* 타입인 ptr2를 그냥 int* 인 ptr1에 대입할 수 없음.
 // a의 주소값을 복사받은 ptr1이 a의 값을 간접참조로 바꿀 수도 있기 때문에
        
int c = 300;
int d = 700;

const int & ref2 = d;
int & ref1 = c;

ref1 = ref2;   // 문제 없음
  • 그냥 참조 타입 변수에 const 참조 타입 변수를 대입하는건 단순히 값을 복사하는 것이기 때문에 괜찮지만 포인터는 주소값을 복사해서 넘겨주는 과정에서 const가 아닌 일반 포인터가 간접참조로 값을 변경할 것을 우려하기 때문에 일반 포인터에 const 포인터를 할당하는건 막혀있다.


const 참조 변수는 R-Value도 참조 가능하다.

const 참조 변수는 L-value, R-value 모두 참조 가능하다.

int & ref = 5; // ❌ 불가능 : 그냥 일반 참조변수는 L-value 변수만 참조할 수 있다.
const int & ref = 5; // ⭕ 가능 : const 참조 변수는 L-value, R-value 모두 참조 가능하다.
void func (const int x) { ... } 

int main()
{
    int a = 2;
    func(a);
}
  • func(a)
    • a의 값이 const int x복사된다.
void func (const int & x) { ... }

int main()
{
    int a = 2;
    
    func(a); 
    func(3 + 1);  // R-vaule 를 매개변수로 넘기는게 가능하다. const int & 로 받으니까!
}
  • func(a)
    • 복사 과정 없이 const int & x인 지역변수 x가 a의 메모리를 참조하게 된다.
      • 파라미터를 `&` 참조로 받으니가 값 복사 과정이 생략되 성능이 올라간다.
    • const형 참조변수라 a의 값을 수정하진 못한다.
  • func(3 + 1)
    • R-vaule 를 매개변수로 넘기는게 가능하다
    • const int & 로 받으니까!
      • 매개변수가 그냥 int & x 였다면 func(3 + 1) 호출이 불가능함. L-value만 대입 받으니까.


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기