[열혈 c++ 프로그래밍] ch2

hyng·2023년 3월 6일
0

열혈 c++ 프로그래밍을 보고 요약정리합니다.

2-1 C언어 복습

키워드 const 의미

  • const int num = 10 // 변수 num을 상수화
  • const int * ptr1 = &val1 // 포인터 ptr1을 이용해서 val1의 값을 변경할 수 없음
  • int * const ptr2 = &val2 // 포인터 ptr2가 상수화
  • const int * const ptr3 = &val3 // 포인터 ptr3이 상수화되었으며, ptr3을 이용해서 val3의 값을 변경할 수 없음

데이터, 스택, 힙 영역

  • 데이터: 전역변수 저장
  • 스택: 지역변수, 매개변수 저장
  • 힙: malloc 함수 호출에 의해 프로그램이 실행되는 과정에서 동적으로 할당이 이뤄지는 영역
  • malloc & free: malloc 함수호출에 의해 할당된 메모리 공간은 free 함수호출을 통해서 소멸하지 않으면 해제되지 않는다.

Call-by-value vs Call-by-reference

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

2-2 새로운 자료형 bool

true는 1로 false는 0으로 변환되기 때문에 다음처럼 int 타입 변수에 할당 가능하다.

int num1 = true; //1
int num2 = false; //0

2-3 참조자의 이해

참조자는 무조건 선언과 동시에 변수를 참조하도록 해야한다.

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 참조 변수가 상수를 참조하지 못했다면 불필요하게 변수를 만들고 변수를 인자로 넘겨주어야 한다.

2-5 malloc & free를 대신하는 new & delete

#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;
}
profile
공부하고 알게 된 내용을 기록하는 블로그

0개의 댓글