|5.1| 함수의 인자 전달 방식


1) call by value

2) call by address

3) call by reference ★



|5.2| 함수 호출시 객체 전달


 객체 전달시, call by value


1
2
3
4
5
6
7
8
9
10
11
void increase(Circle c) {
    int r = c.getRadius();
    c.setRadius(r + 1);
}
 
int main() {
    Circle waffle(30);
    increase(waffle);
    cout << waffle.getRadius() << endl;
}
 
cs


=>객체 전달시 call by value 로 전달된다 (30이 출력)

※ call by value는 실인자 객체의 크기가 크면 객체를 복사하는 시간이 커지는 단점이 있다.



● 객체의 전달시, 생성자와 소멸자의 실행 여부

-> 소멸자만 실행된다. 

1
2
3
4
5
int main() {
    Circle waffle(30);
    increase(waffle);
    cout << waffle.getRadius() << endl;
}
cs

실행 결과




● call by address로 전달한다면

1
2
3
4
5
6
7
8
9
10
void increase(Circle *p){
    int r = p->getRadius();
    p->setRadius(r+1);
}
 
int main(){
    Circle waffle(30);
    increase(&waffle);
    cout << waffle.getRadius() ;
}
cs


 -> 예상대로 31이 출력된다



※ call by address를 사용하면, 매개 변수가 단순 포인터이므로, call by value 시에 발생하는 생성자 소멸의 비대칭 문제가 없고, 복사 시간 소모가 없다.


|5.3| 객체 치환 및 객체 리턴


● 객체 치환

1
2
3
4
5
Circle c1(5);
Circle c2(30);
c1 = c2;    // c1과 c2의 내용은 완전히 같아지나,
            // 내용물만 같을 뿐, 별도의 다른 객체이다.
            // "객체 치환 은 동일한 클래스 타입에서만 적용된다.
cs



|5.4| 참조와 함수


※ C++에서 참조는 다음과 같이 활용된다.

1) 참조 변수
2) 참조에 의한 호출
3) 함수의 참조 리턴

1) 참조 변수

1
2
3
4
5
6
7
int n = 2;
int &refn = n; /* refn은 n의 별명
               참조 변수는 별도의 공간을 갖지 않고,
               원본 변수의 공간을 공유한다.*/
 
Circle circle;
Circle &refc = circle /* refc는 circle의 별명 */
cs


※ 참조 사항



1
int &refn; // 초기화가 없으면 에러가 난다.
cs


1
2
3
int &refn = n;
int & refn = n;
int& refn = n; // &의 위치는 무관하다

cs



2) cal by reference 


※  참조는 call by reference 에서 많이 사용된다.

매개변수가 실인자를 참조하여 실인자와 공간을

공유하도록 하는 인자 전달 방식이다.

매개변수를 reference parameter 라고 부른다.


※ 참조 매개 변수는 이름만 생성되므로, 생성자와 소멸자는

    실행되지 않는다.





1
2
3
4
void swap(int &a, int &b);
 
int m=2, n=9;
swap(m, n); 
cs


swap 함수에 대한 호출은 call by reference 이다.

( 함수의 원형으로 구분한다. )


     ※ 예제 : 참조 매개 변수로 평균 리턴하기



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
 
bool average(int a[], int sizeint& avg) {
    if(size <= 0)
        return false;
    int sum = 0;
    for(int i=0; i<size; i++
        sum += a[i];
    avg = sum/size;
    return true;
}
 
int main() {
    int x[] = {0,1,2,3,4,5};
    int avg;
    if(average(x, 6, avg)) cout << "평균은 " << avg << endl;
    else cout << "매개 변수 오류" << endl;
 
    if(average(x, -2, avg)) cout << "평균은 " << avg << endl;
    else cout << "매개 변수 오류 " << endl;
}
cs



3) 참조 리턴


1
2
3
4
5
6
7
8
9
10
11
12
13
char c = 'a';
 
char& find() {    // char 타입의 참조 리턴
    return c;    //변수 c에 대한 참조 리턴
}
 
char x = find(); // x = 'a'가 됨
 
char &ref = find();
 
ref = 'M';    // c = 'M'
 
find() = 'b'// c = 'b' 가 됨
cs



※ 참조 리턴 예제



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
// 배열 s의 index 원소 공간에 대한 참조 리턴하는 함수
char& find(char s[], int index) {
    return s[index]; // 참조 리턴
}
 
int main() {
    char name[] = "Mike";
    cout << name << endl;
 
    find(name, 0= 'S'// name[0]='S'로 변경
    cout << name << endl;
 
    char& ref = find(name, 2);
    ref = 't'// name = "Site"
    cout << name << endl;
}
 
cs


★★★ 참조 리턴은 연산자 함수에서 대표적으로 사용된다.





'C++ > C++ 문법' 카테고리의 다른 글

#8-1 상속  (0) 2018.10.07
#7-B 연산자 중복  (0) 2018.10.07
#07-A 프렌드  (0) 2018.10.05
#6 함수 중복과 static 멤버  (0) 2018.10.05
#5-B 복사 생성자  (0) 2018.10.05