- 함수의 인자 전달 방식
함수의 인자 전달방식에는 총 세가지가 있다.
Call by value, Call by address, Call by reference.
그중 value와 address를 먼저 보자.
Call by value
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <iostream> using namespace std; void swap(int a, int b){ int temp=a; a=b; b=temp; } int main(){ int m=2, n=9; swap(m, n); cout<<m<<' '<<n<<endl; return 0; } | cs |
출력값
2 9
변하지 않았다. 그저 값만 복사해서 전달했으므로, swap함수 종료와 동시에 swap내부의 변수들은 모두 사라진다.
Call by address
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <iostream> using namespace std; void swap(int *a, int *b){ int temp=*a; *a=*b; *b=temp; } int main(){ int m=2, n=9; swap(&m, &n); cout<<m<<' '<<n<<endl; return 0; } | cs |
출력값
9 2
값이 서로 바뀌었다. 주소 자체에 값을 바꿔 넣었기 때문에 swap함수가 종료되면 바뀌어 있다.
- 함수 호출시 객체 전달
Call by value 방식으로 객체를 전달하면, 다음과 같은데
1 2 3 4 5 6 7 8 9 | void increase(Circle c){ int r = c.getRadius(); c.setRadius(r+1); } int main(){ Circle waffle(30); increase(waffle); cout<< waffle.getRadius() <<endl; } | cs |
이때 waffle의 radius는 30이다.
하지만 Call by address방식으로 객체를 전달하면 다음과 같다.
1 2 3 4 5 6 7 8 9 | void increase(Circle *c){ int r = c->getRadius(); c->setRadius(r+1); } int main(){ Circle waffle(30); increase(&waffle); cout<< waffle.getRadius() <<endl; } | cs |
이렇게 하면 waffle의 radius는 1이 증가한 31이 출력이 된다.
- 객체 치환 및 객체 리턴
객체 치환 시 객체의 모든 데이터가 비트단위로 복사된다.
1 2 3 4 5 6 7 8 9 10 11 | Circle getCircle(){ //객체를 리턴하는 함수 Circle tmp(30); return tmp; //객체를 리턴 } int main(){ Circle c; //객체 생성 cout<<c.getArea()<<endl; //3.14출력 c = getCircle(); //radius=30인 객체를 c에 복사 cout<<c.getArea()<<endl; //2826 } | cs |
'CS > C++' 카테고리의 다른 글
8. C++ 참조와 함수, 복사 생성자 (0) | 2019.02.11 |
---|---|
6. C++ 객체와 객체 배열의 동적 생성 및 반환, this포인터, string 클래스를 이용한 문자열 사용 (0) | 2019.02.11 |
5. C++ 객체 포인터, 객체 배열, 동적메모리 할당 및 반환 (0) | 2019.02.11 |
4. C++ 접근지정, C++ 인라인 함수, C++ 구조체, C++바람직한 코딩 (0) | 2018.11.19 |
3. C++ 클래스(Class), 생성자(Constructor), 소멸자(Destructor) (0) | 2018.11.14 |