열혈 c++ 프로그래밍을 보고 요약정리합니다.
void SwapByValue(int num1, int num2)
{
int temp = num1;
num1 = num2;
num2 = temp;
} Call-by-value
void SwapByRef(int * ptr1, int * ptr2)
{
int temp = *ptr1;
*ptr1 = *ptr2;
*ptr2 = temp;
} Call-by-reference
true는 1로 false는 0으로 변환되기 때문에 다음처럼 int 타입 변수에 할당 가능하다.
int num1 = true; //1
int num2 = false; //0
참조자는 무조건 선언과 동시에 변수를 참조하도록 해야한다.
int num1 = 2010;
int *ptr = &num1; // 변수 num1의 주소 값을 반환해서 포인터 ptr에 저장해라.
int &num2 = num1; // 변수 num1에 대한 참조자 num2를 선언하라.
num2 = 3047;
c++에는 Call-by-reference의 구현 방법에 참조자를 이용하는 방법과 주소 값을 이용하는 방법, 두 가지가 존재한다.
함수의 호출문장만 보고도 함수의 특성을 어느 정도 판단할 수 있어야 한다. 그러나 참조자를 사용하는 경우, 함수의 원형을 확인해야 하고, 확인결과 참조자가 매개변수의 선언에 와있다면, 함수의 몸체까지 문장단위로 확인을 해서 참조자를 통한 값의 변경이 일어나는지를 확인해야 한다.
완벽한 해결을 원한다면 참조자 기반의 함수 정의를 하지 말아야 한다. 그러나 const 키워드를 이용하면, 이러한 단점을 어느 정도 극복할 수 있다.
void HappyFunc(const int &ref) {}
→ 함수 HappyFunc 내에서 참조자 ref를 이용한 값의 변경은 하지 않는다.
int& RetuRefFunc(int n)
{
int num = 20;
num += n;
return num;
}
함수가 반환이 되면 지역변수 num은 소멸이 된다. 따라서 위의 함수처럼 지역변수를 참조형으로 반환하는 일은 없어야 한다.
const int num = 20; // 상수화
int &ref = num; // 참조변수 선언
ref += 10; // 상수화했는데 값을 변경한다?
cout << num << endl;
다행히 위의 경우는 컴파일 에러가 발생한다.
따라서 상수화된 변수에 대한 참조자 선언은 다음과 같이 해야한다.
const int num = 20;
const int &ref = num;
const 참조자는 상수도 참조 가능하다. ← 분명 참조자는 변수만 참조 가능하다고 했는데 어떻게 된걸까?
int num = 20 + 30;
여기서 20과 30은 리터럴 또는 리터럴 상수라 한다. 이 값은 임시로 존재하는 값이다.
즉 20과 30은 다음행으로 넘어가면 참조할 수 없는 값이다.
그런데 아래 코드는 아무런 컴파일에러가 발생하지 않는다.
const int &ref = 50;
c++에서는 위의 문장이 성립하도록 임시변수라는것을 만들고 거기에 30을 저장해 참조자가 이를 참조하게끔 한다.
굳이 왜 c++은 임시변수라는것을 만들어서 이를 가능하게끔 했을까?
int Adder(const int &num1, const int &num2)
{
return num1 + num2;
}
const 참조 변수가 상수를 참조하지 못했다면 불필요하게 변수를 만들고 변수를 인자로 넘겨주어야 한다.
#include <iostream>
#include <string.h>
using namespace std;
char * MakeStrAdr(int len)
{
char * str = new char[len];
return str;
}
int main() {
char * str = MakeStrAdr(20);
strcpy(str, "I am so happy");
delete []str;
return 0;
}