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 |