자료형 bool


C++에서는 참(1)과 거짓(0)을 의미하는 키워드 true false를 지원한다. true와 false는 1과 0이아니지만 , 정수출력시 1과 0으로 변환하여 나타내진다. 

이때 , 키워드 true와 false의 자료형이 bool이다.


참조자(Reference)


변수는 할당된 메모리공간에 붙여진 이름이다. 이름을통해 해당 메모리공간에 접근이 가능하다. 이때 , 하나의 할당된 메모리공간에 두개의 이름을 부여하는것이 참조자선언이다.


int num1 = 2018;

int arr[3]={1,3,5};

int * ptr = &num1;

int ** dptr = &ptr;

int &num2 = num1; // num2는 num1의 참조자

int &num3 = num2; // 참조자를 대상으로 참조자를 선언할 수 있다

int &num4 = arr[0]; // 배열요소도 참조자선언이 가능하다

int *(&pref) = ptr; // 포인터변수의 참조자선언

int **(&dpref) = dptr; //이중 포인터변수의 참조자선언


이미 선언된 변수앞에 &연산자가 붙으면 주소값 반환을 명령하는 뜻이지만, 새로 선언되는 변수 이름앞에 붙을땐 참조자의 선언을 뜻하는것이 된다.

함수 내에서 선언된 지역적(local) 참조자 또한 지역변수와 마찬가지로 함수를 빠져나가면 소멸된다. 또한 참조자는 반드시 선언과동시에 변수를 참조하도록 해야한다. 배열요소는 변수로 간주되어 참조자의 선언이가능하다.


참조자를 이용한 Call - by - reference


void Swap( int &ref1, int &ref2) // 매개변수는 함수의 호출시 초기화가 진행되기때문에 , 함수의 호출시 전달되는 인자로 초기화된다.

{

int temp = ref1;

ref1=ref2;

ref2=temp;

}


const참조자


void HappyFunc ( int & ref ){ ... } 으로 선언되어있을때,

int num=20;

HappyFunc(num);

std :: cout<<num<<std :: endl;

은 20이 출력될지 알 수 없다. ( C언어에서는 매개변수에 num값을 전달할때는 num값이 절대 변하지않기때문에 20이 출력됨을 알수있다 )

이때 , 가독성이 떨어지는 단점이있다. 이를 보완하기위해 

void HappyFunc ( const int & ref ){ ... } 로 함수를 선언하게되면 ,ref참조자를 이용해 변수값을 변경하지않겠다는 선언이되어 코드의가독성을 높일수 있다.


반환형이 참조형인경우


int num1=1;

int & RefRetFuncOne( int &ref )

{

ref ++;

return ref;

}

int &num2=RefRetFuncOne(num1);

int num3 = RefRetFuncOne(num1);


이렇게 선언되어있을때 , num2는 num1의 참조자가되고 , 메모리주소값을 공유하게된다. num3는 num1의 참조자가 아닌 별개의 변수가된다.

반환형이 int형인경우엔 int형 자료형 변수에만 저장이 가능하다. ( 반환값이 상수이기때문 )


const 참조자 주의


const int num =3;

const int &ref = num;

const int &ref1= 30; // const 선언된 참조자는 상수도 참조 가능하다


num과같이 상수선언된 변수의 참조자를 선언할때는 const선언을 붙여줘야한다. const 참조자가 상수를 참조할때 C++에서는 임시변수를 만들고 그 장소에 30값을 저장하고선 참조자가 이를 참조하게끔한다.


int adder ( const int & num1 , const int & num2)

{

return num1+num2;

}

std :: cout<<adder (3,4)<<std::endl;


위와 같은 함수를 선언했을때  인자전달을 목적으로 변수를 선언한다는것은 매우 번거로운일인데 , cosnt 참조자의 상수참조를 허용함으로서 간단한 함수호출을 가능케했다.


malloc&free를 대신하는 new&delete


C언어에서 힙영역에 메모리를 할당할때는 malloc&free를 이용했는데 이는 두가지 불편사항이있다.

할당할 대상의 정보를 무조건 바이트 크기단위로 전달해야한다,

반환형이 void 형 포인터이기때문에 적절한 형변환을 거쳐아한다.


C++에서 지원하는 키워드 new와 delete 를 사용하면 이러한 불편함을 해소할 수 있다,


int 형 변수의 할당 int * ptr1 = new int;

double형 변수의 할당 double * ptr2 = new double;

길이가 3인 int형 배열의 할당 int * arr1 = new int[3];

int형 변수의 소멸 delete ptr1;

double형 변수의 소멸 delete ptr2;

int형 배열의 소멸 delete []arr1;


C++에서는 new연산자를 이용해서 할당된 메모리공간도 변수로 간주하기때문에 , 참조자선언이 가능하다.

int *ptr = new int;

int &ref = *ptr; // 힙영역에 할당된 변수에대한 참조자선언

ref =20; // 참조자를이용해 포인터연산없이 힙영역에 접근할수있다


C++에서 C언어의 표준함수호출하기


c를 더하고 .h를 빼라

#include<stdio.h>   -> #include <cstdio>

가급적 C++의 표준헤더를 이용해서 함수를 호출하는것이 좋다

+ Recent posts