C++ / / 2021. 6. 27. 23:14

[#2 열혈강의 C++]

2021-06-25

 

이름공간(namespace)은 말 그대로 이름을 붙여놓은 공간이다.

main함수 바깥 영역에

namespace AbcdPart{

    void abcd(){

        }

};

와 같이 작성한다.

main 함수 안에서는
AbcdPart :: abcd(); 로 이름공간 AbcdPart내에 정의된 함수 abcd()를 호출한다.


[Chapter 02] C언어 기반의 C++2

 

참조자(Reference) 어떤 변수를 대신할 수 있는 또 하나의 이름이다.

int num1 = 1;

int &num2 = num1;

이렇게 작성하면 num2는 num1의 참조자가 된다.

참조자는 변수의 별명 이라고 이해할 수 있다.

다른 사람들이 나를 별명으로 불러도 나를 부른다는 것을 알 수 있는 것처럼 참조자 또한 그렇다.

마찬가지로 별명을 여러개 가질수 있는것 처럼 참조자 또한 여러개가 가능하다.

참조자는 다른 참조자를 대상으로 선언하는 것도 가능하다.

int &ref = 1; (x)

변수를 상대로만 선언가능하다.

참조자는 함수에서 많은 활용이 있다.

 

Call-by-value, Call-by-reference 의 두가지 함수의 호출방식이 있다.

전자는 인자에 값이 전달되는 방식이다.

void SwapByValue(int n1, int n2){

    int temp = n1;

    n1=n2;

    n2=temp;

}

이와 같은 방식은 함수 내부에서 함수 외부의 변수에 접근이 불가능하다는 것이다.

후자의 방식은 인자에 주소 값이 전달되는 방식인데, 이 방식은 주소 값을 통해 해당 값에 접근하므로 함수 외부의 변수에 접근이 가능하다.

void SwapByRef(int *ptr1, int *ptr2){

    int temp = *ptr1;

    *ptr1 = *ptr2;

    *ptr2 = temp;

}

 

C++에서 함수 외부의 변수에 접근하는 방식은 주소 값을 이용한 방식, 참조자를 통한 방식. 두가지 방식이 있다.

void SwapByRef2(int &ref1, int &ref2){

    int temp = ref1;

    ref1 = ref2;

    ref2 = temp;

}



***문제 02-1 - 문제3***80p
void SwapPointer(int *(pref1), int *(&pref2) ){

    int * ptr = pref1;

    pref1 = pref2;

    pref2 = ptr;

}

int main(){

    int num1 = 5;

    int *ptr1 =&num1;

    int num2 = 10;

    int *ptr2 = &num2;

    SwapPointer(ptr1, ptr2);

    cout<<*ptr1<<endl;

    cout<<*ptr2<<endl;

}

와 같이 프로그램을 작성했을때에 스왑이 일어나는 과정중 pref1(ptr1) 와 pref2(ptr2)의 값만 변화하고

각자의 주소값은 바뀌지 않는다. pref1은 ptr1의 참조자 이기 때문에 서로의 주소값은 당연히 같다.(참조자)

따라서 pref1 과 pref2의 값은 num1, num2의 주소값을 담고 있었는데, 이 주소값이 서로 바뀌기 때문에 

메인함수에서 *ptr1을 통해 ptr1의 주소값이 가리키는 값을 출력할 시 바뀐 값이 나오게된다.

또한, int *ptr = pref1; 에서 ptr은 새로운 공간을 할당 받는다.(새로운 주소값) 

 

'C++' 카테고리의 다른 글

[#6 열혈강의 C++]  (0) 2021.07.07
[#5 열혈강의 C++]  (0) 2021.07.04
[#4 열혈강의 C++]  (0) 2021.06.30
[#3 열혈강의 C++]  (0) 2021.06.28
[#1 열혈강의 C++]  (0) 2021.06.24
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유