728x90
728x90
02-1 참조자 기반의 call-by-reference

1. 참조자를 이용해서 다음 요구사항에 부합하는 함수를 각각 정의하고, 호출하여 결과까지 확인하라.

- 인자로 전달된 int형 변수의 값을 1씩 증가시키는 함수
- 인자로 전달된 int형 변수의 부호를 바꾸는 함수

 

푼 것

#include <iostream>
using namespace std;

void addOne(int &num) {
    num++;
}

void chgSign(int& num) {
    num = num * -1;
}

int main(void)
{
    int num = 1;
    
    addOne(num);
    chgSign(num);

    cout << num << endl;
    
    return 0;
}

 

 

2. SwapByRef2를 아래처럼 호출하면 컴파일에러가 난다. 그 이유는?

void SwapByRef2(int &ref1, int &ref2) { ... } ;
SwapByRef2(23, 45);

 

푼 것 : 상수는 참조자에 대입할 수 없어서

 

 

3. ptr1과 ptr2를 대상으로 SwapPointer(ptr1, ptr2)를 호출하고 나면 ptr1과 ptr2가 서로 가리키는 대상이 바뀌도록 SwapPointer 함수를 정의해본다.

 

푼 것

#include <iostream> 
using namespace std;

void SwapPointer(int *(&a), int* (&b)) 
{
    int temp = *b;
    *b = *a;
    *a = temp;
}

int main(void)
{
    int num1 = 5;
    int* ptr1 = &num1; //주소
    int num2 = 10;
    int* ptr2 = &num2;
    
    //cout << *ptr1 << endl;
    SwapPointer(ptr1, ptr2); 

    cout << num1 << endl;
    cout << num2 << endl;
    
    return 0;
}

 

 

02-2 const 포인터와 const 참조자

포인터 변수를 선언해서 위 변수를 가리키게 한 뒤, 이 포인터 변수를 참조하는 참조자를 선언한다.
이렇게 선언된 포인터 변수와 참조자를 이용해서 num에 저장된 값을 출력하는 예제를 만든다.

const int num=12;

 

푼 것

int main(void)
{
    const int num = 12;
    const int *ptr = &num;
    const int& ref = *ptr;
    
    cout << ref << endl;
    
    return 0;
}

 

 

02-3 구조체에 대한 new & delete 연산

아래는 2차원 평면상에서의 좌표를 표현할 수 있는 구조체를 정의했다.

typedef struct __Point
{
    int xpos;
    int ypos;
} Point;

위의 구조체를 기반으로 두 점의 합을 계산하는 함수를 다음의 형태로 정의하며 덧셈결과는 함수의 반환을 통해 얻고

Point& PntAdder(const Point &p1, const Point &p2);

임의의 두 점을 선언하여 위 함수를 이용한 덧셈연산을 진행하는 main함수를 정의해보자. 단 구조체 Point 관련 변수의 선언은 무조건 new 연산자를 이용해서 진행하며, 할당된 메모리 공간의 소멸도 빼먹지 말자. 이 문제의 해결을 위해서는 다음 두 질문에 답을 할 수 있어야 한다.

1) 동적할당한 변수를 함수의 참조형 매개변수의 인자로 어떻게 전달해야 하나?
2) 함수 내에 선언된 변수를 참조형으로 반환하려면 해당 변수는 어떻게 선언해야 하나?

 

해설

#include <iostream>
using namespace std;

// 평면상 좌표를 구하는 구조체
typedef struct __Point
{
    int xpos;
    int ypos;
} Point;

Point& PntAdder(const Point& p1, const Point& p2) {
    // 참조형으로 지역변수를 전달
    Point* pptr = new Point;
    pptr->xpos = p1.xpos + p2.xpos;
    pptr->ypos = p1.ypos + p2.ypos;
    return *pptr;
}

int main(void)
{
    // 동적할당
    // ** 2차원 좌표는 두개가 필요하다
    Point* pptr1 = new Point;   
    pptr1->xpos = 10;
    pptr1->ypos = 20;
    
    Point* pptr2 = new Point;
    pptr2->xpos = 15;
    pptr2->ypos = 25;

    // 참조형 매개변수의 인자로 전달
    Point& pref = PntAdder(*pptr1, *pptr2);
    // 출력
    cout << pref.xpos <<", " <<pref.ypos<< endl;

    // 삭제
    delete pptr1;
    delete pptr2;
    delete &pref;
    
    return 0;
}

 

 

02-4 C++ 표준함수 호출

생략

728x90
728x90
블로그 이미지

coding-restaurant

코딩 맛집에 방문해주셔서 감사합니다.

,

v