2-1. 들어가기에 앞서서.
문제 1 : const 키워드의 의미
• const int n=10;
• const int* n;
• int* const n;
• const int* const n
문제 2 : stack의 용도 및 특징
문제 3 : heap의 용도 및 특징
문제 4 : malloc & free 함수의 필요성
2-2. 자료형 bool
참을 의미하는 true, 거짓을 의미하는 false중 하나의 값을 가진다.
2-3. 레퍼런스의 개념
대상에 별명을 붙여주는 행위
int & ref= val;
int main(void)
{
int val=10;
int *pVal=&val; // 주소 값을 얻기 위해 & 연산자 사용
int &rVal=val; // 레퍼런스 선언을 위해 & 연산자 사용
return 0;
}
- 레퍼런스에 대한 또 다른 접근
변수란? 메모리 공간에 붙여진 이름.
그런 메모리 공간에 이름을 하나 더 추가하는 행위.
- 레퍼런스의 제약.
이름이 존재하지 않는 대상은 레퍼런스화 할수 없다.
선언과 동시에 바로 초기화 하여야 한다.
int main(void)
{
int &ref1; // 초기화되지 않았으므로 ERROR!
int &ref2=10; // 상수가 올 수 없으므로 ERROR!
int val=10;
ref1=val;
. . . . .
2-4. 레퍼런스와 함수.
- 포인터를 이용한 call-by-reference
함수 외부에 선언된 변수의 접근이 가능.
포인터 연산에 의해서 가능.
따라서 포인터 연산의 위험성 존재.
void swap(int *a, int *b)
{
int temp=*a;
a++; //잘못 들어간 코드
*a=*b;
*b=temp;
}
2-5. 레퍼런스를 이용한 성능의 향상.
- 부담스러운 call-by-value
함수 호출 시 인자 전달 과정에서 발생.
데이터를 복사하는 과정에서 발생.
- 대신할 수 있는 call-by-reference
전달되는 인자를 레퍼런스로 받으면 데이터의 복사 연산이 필요 없다.
원본 데이터의 손실 가능성이 있다. à const 선언의 이유.
2-6. 레퍼런스를 리턴하는 함수.
/* ref_return.cpp */
int& increment(int &val)
{
val++;
return val;
}
int main(void)
{
int n=10;
int &ref=increment(n);
cout<<"n : "<<n<<endl;
cout<<"ref: "<<ref<<endl;
return 0;
}
/* ref_error.cpp */
int& function(void)
{
int val=10;
return val;
}
int main(void)
{
int &ref=function();
cout<<ref<<endl;
return 0;
}
레퍼런스 리턴을 가급적이면 사용하지 않는 것이 좋겠다.
2-7. new & delete
- new와 delete 연산자의 기본 기능.
int main(void)
{
int * val = new int;
int * arr = new int[size];
. . . . .
delete val;
delete []arr;
. . . . .
int main(void)
{
int * val = (int*)malloc(sizeof(int));
int * arr = (int*)malloc(sizeof(int)* size);
. . . . .
free(val);
free(arr);
. . . . .
- NULL 포인터를 리턴하는 new 연산자.
메모리 할당 실패 시 NULL 포인터 리턴.
int* arr=new int[size]; // 배열의 동적 할당
if(arr==NULL) // 동적 할당 검사
{
cout<<"메모리 할당 실패"<<endl;
return -1; //프로그램 종료
}
'C,C++' 카테고리의 다른 글
Query Performance Counter (0) | 2015.12.22 |
---|---|
열혈강의C++ 3장 요약 (0) | 2015.12.09 |
열혈강의C++ 1장 요약 (0) | 2015.09.15 |