-const int num = 10; -> 변수 num을 상수화
-const int ptr1 = &val1; -> 포인터 ptr1을 이용해서 val1의 값을 변경 X
-int const ptr2 = &val2; -> 포인터 ptr2가 상수화
-const int * const ptr3 = &val3; -> 포인터 ptr3가 상수화 되었으며, ptr3을 이용해서 val3의 값 변경 X
데이터 – 전역변수가 저장되는 영역
스택 – 지역변수 및 매개변수가 저장되는 영역
힙 – malloc 함수호출에 의해 동적으로 메모리 할당이 이루어지는 영역
Malloc & free – malloc 함수 호출에 의해 할당된 메모리 공간은 free 함수호출을 통해서 소멸하지 않으면 해제되지 않음
#include <iostream>
using namespace std;
int main(void)
{
int num = 10;
int i = 0;
cout << "true: " << true << endl;
cout << "false: " << false << endl;
while (true)
{
cout << i++ << ' ';
if (i > num)
break;
}
cout << endl;
cout << "sizeof 1: " << sizeof(1) << endl;
cout << "sizeof 0: " << sizeof(0) << endl;
cout << "sizeof true: " << sizeof(true) << endl;
cout << "sizeof false: " << sizeof(false) << endl;
return 0;
}
자료형 bool은 1byte이며 함수의 반환형으로도 사용이 가능함
#include <iostream>
using namespace std;
int main(void)
{
int num1 = 1020;
int& num2 = num1;
num2 = 3047;
cout << "VAL: " << num1 << endl;
cout << "REF: " << num2 << endl;
cout << "VAL: " << &num1 << endl;
cout << "REF: " << &num2 << endl;
return 0;
}
int &num2 = num1 이와 같이 참조자는 변수로 초기화를 시켜주며 할당된 하나의 메모리 공간에 둘 이상의 이름을 부여하고 싶을 때 사용한다.
또한 참조자는 자신이 참조하는 변수를 대신할 수 있는 또 하나의 이름으로써 사용할 수 있음.
int num = 12;
int * ptr = #
int ** dptr = &ptr;
int &ref = num;
int *(&pref) = ptr;
int **(&dpref) = dptr;
int &ref = arr[0]; // 배열의 요소도 변수로 간주됨
Void Swap(int *ptr1, int * ptr2)
{
int temp = *ptr1;
*ptr1 = *ptr2;
*ptr2 = temp;
}
Void Swap(int &ref1, int &ref2)
{
int temp = ref1;
Ref1 = ref2;
Ref2 = temp;
}
int num = 24;
HappyFunc(num);
cout << num << endl;
다음과 같은 문장에 num의 값은 변하지 않겠지만
Void HappyFunc(int &ref)인 경우 함수만 보고 값이 변할지 안변할지 확인할 수 없음! 따라서 이 단점을 보완하기 위해 const int &ref를 사용하여 참조자의 단점을 보완함 (참조자를 통한 값의 변경을 진행하지 않는 경우)
int& RefRetFuncOne(int &ref)
{
ref++;
return ref;
}
int main(void)
{
int num1 = 4;
int &num2 = RefRetFuncOne(num1);
...
}
이러한 코드가 있을때 참조형으로 반환된 값을 참조자에 저장하게 되면 num1과 num2만 남고 ref는 함수가 반환될때 사라지므로 num1 = num2 = 4 가 됨.
int num2 = RefRetFuncOne(num1);
이 경우에는 참조자가 아닌 변수로 값을 반환받았으므로 num1과 num2가 각기 다른 공간을 가지고 있음
마지막으로 반환형이 기본 자료형인 경우
int RefRetFuncOne(int &ref)
...
이고 반환 받을 때 num2에 저장을 하게 되면 참조형 ref가 가지고 있는 값이 num2에 저장이 됨. 이러한 경우
int &num2 = RefRetFuncOne(num1) (x)
반환 값이 상수이기때문에 참조형에다가 저장을 할 수 가 없음!
또한 지역변수를 반환하는 경우에도 참조의 형태로 반환을 하게 되면 지역변수는 소멸이 되기 때문에 참조형으로 반환 하는 일이 없어야 함!
const int &ref = 50
위와 같이 const 선언에 의해서 만들어진 변수를 상수화된 변수라고 하며 임시변수를 만들어 줌(참조자가 위와 같이 상수변수를 참조할 수 있도록)
int * ptr = new int;
int * arr1 = new int[3];
delete ptr;
delete []arr1;
그러나 new의 경우 다음과 같이 간결하게 동적할당을 해줄 수 있음.
#include <iostream>
#include <string.h>
using namespace std;
class Simple
{
public:
Simple()
{
cout << "I'm simple constructor!" << endl;
}
};
int main(void)
{
cout << "case 1: ";
Simple* sp1 = new Simple;
cout << "case 2: ";
Simple* sp2 = (Simple*)malloc(sizeof(Simple) * 1);
cout << endl << "end of main" << endl;
delete sp1;
free(sp2);
return 0;
}
다음을 실행시켰을 때 class Simple의 constructor가 malloc일때는 실행이 되지 않고 new일 때만 실행이 됨!
cpp 에서 객체의 생성은 무조건 new&delete사용을 원칙으로 함.
#include<stdio.h> -> #include<cstdio>
#include<stdlib.h> -> #include<cstdlib>
#include<math.h> -> #include<cmath>
#include<string.h> -> #include<cstring>
C와 다르게 C++ 표준 라이브러리에서는 함수 오버로딩이 가능하기 때문에 함수를 사용처에 따라 아무렇게나 사용할 수 있도록 함수 오버로딩을 해놓았기 때문에 가급적 C++문법을 기반으로 개선된 형태로 라이브러리가 구성되어 있으므로 C++의 표준헤더를 이용해서 함수를 호출하는 것이 좋음.