|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; // &의 위치는 무관하다 |
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 size, int& 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 |