1. const 키워드 사용법
const int n=10; //n값의 변경 불가능
int a=10;
int b=20;
const int* p=&a; // 포인터p가 가리키는 변수 a를 상수화 시킨다.
// 포인터p가 a를 바라봤을때 상수처럼 보인다..
// *p=30 (x) a=20(o)
int* const p=&a; // p라는 값 자체를 상수화 시킴
// 프로그램이 종료될때까지 p는 a라는 변수를 가리키고 있어야함.
// p=&b (x) *p=30(o)
const int* const p=&a; //위의 두가지 기능을 다 가짐
2. bool
bool형 변수는 true 와 false 키워드가 기본적으로 제공된다.
int형의로 변환시 1과0 이 되지만 true 와 false 는 bool형 데이터로 인정해줘야함.
3. 레퍼런스(reference)
int val=0;
int &ref=val;
val이라는 변수이름에 ref라는 별명을 붙여준개념.
레퍼런스와 변수는 생성방법에서만 차이를 보일뿐 일단 만들어지고 나면 완전히 같음.
다만..
int &ref;
int &ref=10;
이런식의 선언은 불가..변수가 선언된다음에야 레퍼런스 선언이 가능.
레퍼런스를 이용한 call-by-reference.
#include <iostream>
using std::cout;
using std::endl;
void swap(int &a,int &b) // 레퍼런스의 형태로 받아주므로
{ // 스왑연산이 가능하다.
int temp=a; // 일반함수형태의 값의 복사(call-by-value)가 아닌
a=b; // 레퍼런스로 연산하는 call-by-reference
b=temp;
}
int main()
{
int val1=10;
int val2=20;
cout<<"val1 = "<<val1<<endl;
cout<<"val2 = "<<val2<<endl;
swap(val1,val2); // 함수호출시 일반함수와 차이를 알아보기힘듬
cout<<"val1 = "<<val1<<endl;
cout<<"val2 = "<<val2<<endl;
return 0;
}
단점은 함수호출시 일반함수와의 차이를 알아보기 힘들다.
장점은 함수호출시 매개변수의 복사가 이루어지지 않고 레퍼런스로
연산이 가능하기때문에 메모리공간의 효율성
다만..함수의 매개변수에서 상수화시켜 받아주는 센스가 필요함.
설명->매개변수로 받는값에 p라는 별명을 붙여준 값을 상수화하여 함수를연산하라.
레퍼런스의 return
#include <iostream>
using std::cout;
using std::endl;
int& increment(int &val) // 변수n에 val이라는 별명을 붙여주고
{
val++;
return val; // 그 별명값을 리턴하라..리턴형은 int의 레퍼런스
}
int main()
{
int n=10;
int &ref=increment(n); // int의 레퍼런스형태로 함수를 받아주고 있다.
cout<<"n : "<<n<<endl;
cout<<"ref: "<<ref<<endl;
return 0;
}
레퍼런스 리턴시 잘못된 함수
#include <iostream>
using std::cout;
using std::endl;
int& function(void)
{
int val=10;
return val;
}
int main()
{
int &ref=function();
cout<<"ref: "<<ref<<endl;
return 0;
}
main함수 내에 변수가 선언이 되지 않았고..
function함수 내에서 선언된 int형 변수 val은 함수가 호출되고 종료되는 순간에
스택에서 사라지므로 딱봐도 말이 좀 안된다...
지역변수를 레퍼런스로 리턴하는 일은 없어야 한다.
4. new & delete
C언어의 malloc,free함수를 C++에서는 new와 delete가 대신한다.
C : int* arr=(int*)malloc(sizeof(int)*size)); 이런식으로 선언함
malloc함수가 리턴하는 값이 void형 포인터이기때문에 형변환을 해주어야함.
C++ : int* arr = new arr[size];
new연산자는 용도에 맞게 포인터를 반환하므로 형변환을 할 필요가없다.
다만 배열의 메모리반환시에
delete []arr;
로 선언을 해주어야한다.2차원이건 3차원이건 같다.
메모리 할당 실패시 new연산자는 NULL포인터를 리턴한다.