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 = #
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++ 표준함수 호출
생략
'C, C++ > 열혈 C++ 프로그래밍' 카테고리의 다른 글
04. 클래스의 완성 연습문제 (0) | 2021.09.23 |
---|---|
3. 클래스의 기본 (0) | 2021.09.15 |
02-3. 참조자(Reference)의 이해 (0) | 2021.09.13 |
[윤성우 열혈 c++] OOP 단계별 프로젝트 01단계 (0) | 2021.08.19 |
02-1 챕터 02의 시작에 앞서 (0) | 2021.08.19 |