본문 바로가기
Programming/C++

Literal, 참조 / "문자열"이 왜 그렇게 골치아픈가

by 꿈꾸는 띵땅근 2020. 12. 27.

 

학습 내용
1. 상수 = 리터럴... 따라서 참조 안됨. 
2. 배열도 참조 안됨. 

1. 상수는 리터럴이다. 참조가 안된다. 
int a = 5;
int& b = a; // a의 별칭 b를 만든것이다. 
b = 4;      // b = a = 4

- 위와같이 하면 a = 4로 바뀐다. 

 

int& a = 4;

 

- 이건 안된다. 이게 되면, 아래처럼 되어버릴 수 있기때문

 

int& a = 4; // 이게 원래 안되는것임. 
a = 5;

- 그러면 4가 5로 바껴야한다 (말이 안된다)

    

 

 


- const로 참조는 가능하다. 

const int& a = 4; // a를 변형시키지 않겠습니다!
int b = a;

이런식의 사용은 가능!


- 추가예시 

 

int& FuncOne(int &a){
   a++;
   return a;
}


int FuncTwo(int &a){
   a++;
   return a;
}

 

1-A>

int num1;
int num2 = FuncOne(num1);

1-B>

int num1;
int &num2 = FuncOne(num1);

1-A와 1-B의 차이를 알겠는가?

1-A에서는 값의 복사가 이뤄진다.  num1과 num2는 별개의 변수가 된다!

1-B에서는, num1의 별칭으로 num2가 등록된다. 

 

 

2-A>

int num1;
int num2 = FuncTwo(num1);

2-B>

int num1;
int &num2 = FuncTwo(num1); // 에러!!!!!!!!!

둘의 차이를 알겠는가?

참고로 애초에 FuncTwo는 rvalue (리터럴 상수라고 이해하면 쉽다.)을 리턴한다. 

2-A에서는, num2에선 FuncTwo가 반환한 임시변수의 값이 복사되어 num2에 저장된다.

    즉, num1과 num2는 애초에 다른 변수이다!

2-B에서는,

참조자는 상수를 저장 할 수 없으므로, 애초에 컴파일 에러가 나는 구문이다!

 


2. 배열 참조 안됨

오류

배열은 실제 메모리에 데이터를 저장하는 것이고, 참조는 메모리를 차지하지 않기 때문에, 말이 안되는것이다. 


- 배열에 굳이 참조 하고싶다면, 배열을 우선 선언하고(메모리를 만들고), 참조를 거는 방법이 있다. 

이렇게 하면 가능


출처
 

씹어먹는 C 언어 - <15 - 3. 일로와봐, 문자열(string) - 문자열 지지고 볶기 & 리터럴>

 

modoocode.com

정리가 잘되어 있다. 나 스스로도 정리해보자. 

 

[C++] 참조자를 리턴하는 함수.. 이해 쉽게 하기.

먼저 설명에 들어가기 앞서서,  이 사실을 기억하자. 1 ) int a = 30;  ->  rvalue인 30을 복사 떠서 a에 저장. (30이 a로 이동하는게 아니다. 복사를 하는것이다! 이런 함수가 있다고 가정해보자. int& Func

siminq.tistory.com

 

'Programming > C++' 카테고리의 다른 글

Class 객체 선언 방식 2가지  (0) 2021.01.01
C++ 캡슐화, 디폴트 생성자, new, 복사생성자  (0) 2020.12.27
구조체  (0) 2020.12.27
C++ 코드최적화  (0) 2020.12.26
Const(상수)  (0) 2020.12.26

댓글