2장정리

C++프로그래밍/C++ 2007. 7. 13. 10:01

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;
}


단점은 함수호출시 일반함수와의 차이를 알아보기 힘들다.

장점은 함수호출시 매개변수의 복사가 이루어지지 않고 레퍼런스로
연산이 가능하기때문에 메모리공간의 효율성
다만..함수의 매개변수에서 상수화시켜 받아주는 센스가 필요함.

ex) void ShowData(const person &p)

설명->매개변수로 받는값에 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포인터를 리턴한다.

블로그 이미지

百見 이 不如一打 요 , 百打 가 不如一作 이다.

,