C++/열혈 C++ 프로그래밍(윤성우 저)

열혈 C++ 프로그래밍 2-1 문제

꾸준함. 2017. 5. 28. 21:48

[1번 문제]

/*

참조자를 이용해서 다음 요구사항에 부합하는 함수를 각각 정의하여라

1.인자로 전달된 int 변수의 값을 1 증가시키는 함수

2.인자로 전달된 int 변수의 부호를 바꾸는 함수

*/

#include <iostream>

using namespace std;

 

void add(int &ptr) //참조자를 이용한 함수, 물론 포인터를 이용해도 된다

{

        ptr += 1;

}

 

void reverse(int &ptr)

{

        ptr *= -1;

}

 

int main(void)

{

        int num;

        cout << "숫자를 입력하세요:";

        cin >> num;

        cout << "원래 숫자:" << num << endl;

        add(num);

        cout << "1 증가시킨 숫자:" << num << endl;

        reverse(num);

        cout << "부호 바꾼 숫자:" << num << endl;

        return 0;

}

 



[2번 문제]

앞서 소개한 예제 RefSwap.cpp의 SwapByRef2함수를 다음의 형태로 호출하면 컴파일에러가 발생한다

SwapByRef2(23, 45);

컴파일 에러가 나는 이유가 무엇인지 설명해보자.


RefSwap.cpp

#include <iostream>

using namespace std;

 

void SwapByRef2(int &ref1, int &ref2)

{

        // 참조자 ref1, ref2 저장된 값의 교환과정이다. 교환의 과정은 main 함수에 선언된 변수 val1 val2 교환으로 이어진다

        int temp = ref1;

        ref1 = ref2;

        ref2 = temp;

}

 

int main(void)

{

        int val1 = 10;

        int val2 = 20;

 

        SwapByRef2(val1, val2); //매개변수로 참조자가 선언되었으니, 참조의 대상이 변수를 인자로 전달하면 된다

        cout << "val1: " << val1 << endl;

        cout << "val2: " << val2 << endl;

        return 0;

}

 

>매개변수 선언위치에 참조자가 선언되었다. 그런데 참조자는 상수를 참조할 수 없기 때문에 매개변수의 인자로는 반드시 변수가 등장해야 한다. 그래서 상수를 전달하는 SwapByRef2 ㅎ람수의 호출에는 컴파일 에러가 발생한다.


[3번 문제]

/*

문제의 제시에 앞서 먼저 다음 코드를 보자

int main(void)

{

int num1 = 5;

int *ptr1 = &num1;

int num2 = 10;

int *ptr2 = &num2;

....

}

코드를 보면 ptr1 ptr2 각각 num1 num2 가리키고 있다. ptr1 ptr2 대상으로 다음과 같이 함수를 호출하고 나면

SwapPointer(ptr1, ptr2);

ptr1 ptr2 가리키는 대상이 서로 바뀌도록 SwapPointer함수를정의해보자

*/

#include <iostream>

using namespace std;

 

void SwapPointer(int *(&ptr1), int *(&ptr2))

{

        int *pointer = ptr1;

        ptr1 = ptr2;

        ptr2 = pointer;

}

 

int main(void)

{

        int num1 = 5;

        int *ptr1 = &num1;

        int num2 = 10;

        int *ptr2 = &num2;

        cout << "기존 포인터 ptr1 가리키던 숫자:" << *ptr1 << endl;

        cout << "기존 포인터 ptr2 가리키던 숫자:" << *ptr2 << endl;

        SwapPointer(ptr1, ptr2);

        cout << "바뀐 포인터 ptr1 가리키는 숫자:" << *ptr1 << endl;

        cout << "바뀐 포인터 ptr2 가리키는 숫자:" << *ptr2 << endl;

        return 0;

}


개발 환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] 열혈 C++ 프로그래밍 윤성우 저

반응형