티스토리 뷰

1. c++에서 함수의 인자전달 방법


 (1) call_by_value : 값에 의한 호출, 호출하는 코드에서 넘겨주는 실인자 값이 함수의 매개 변수에 복사되어 전달되는 방식.

   

     * call by value로 객체를 전달할때의 문제점 (예제5-1 소스코드를 이용해서 설명)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
 
using namespace std;
 
class Circle {
private:
    int radius;
public:
    Circle();
    Circle(int r);
    ~Circle();
    double getArea() { return 3.14 * radius * radius; }
    int getRadius() { return radius; }
    void setRadius(int radius) { this->radius = radius; };
};
 
Circle::Circle() {
    radius = 1;
    cout << "생성자 실행 radius = " << radius << endl
}
 
Circle::Circle(int radius) {
    this->radius = radius;
    cout << "생성자 실행 radius = " << radius << endl
}
 
Circle::~Circle() {
    cout << "소멸자 실행 radius = " << radius << endl
}
 
void increase(Circle c)  {
    int r = c.getRadius();
    c.setRadius(r + 1);
}
 
int main() {
    Circle waffle(30);
    increase(waffle);
    cout << waffle.getRadius() << endl;
}
cs

실행결과

문제점: 값에 의한 호출을 이용할 경우 C++ 컴파일러는 매개 변수의 객체의 생성자는 실행되지 않고 소멸자만 실행되도록 컴파일 합니다.

또한 값에 의한 호출은 함수 안에서 매개 변수의 객체에 어떤 변화가 일어나도 실인자를 훼손시키지 않는 장점이 있는 반면, 실인자 객체의 크기가 크면 객체를 복사하는 시간이 커지는 단점이 있다.



 (2) call_by_address: 주소에 의한 호출, 주소를 직접 포인터 타입의 매개 변수에 전달받는 방식.


 (3) call_by_reference: 참조에 의한 호출, 함수의 매개 변수를 참조 타입으로 선언하여, 매개 변수가 함수를 호출하는 쪽의 실인자를 참조하여 실인자와 공간을 공유하는 인자 전달 방식. (반드시 초기화를 하여야 함)

(예제 5-3)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
int main()
{
    cout << "i" << '\t' << "n" << '\t' << "refn" << endl;
    int i = 1;
    int n = 2;
    int &refn = n;
    n = 4;
    refn++;
    cout << i << '\t' << n << '\t' << refn << endl;
    
    refn = i;
    refn++;
    cout << i << '\t' << n << '\t' << refn << endl;
    
    int *= &refn;
    *= 20;
    cout << i << '\t' << n << '\t' << refn << endl;
    
    system("pause");
}
 
cs






























실행결과



2. 참조매개변수가 필요한 경우 예제 5-5 소스코드, 실행결과, 주석(장점)

(예제 5-5 주석)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#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++)        // 배열 a의 원소들의 합을 구하는 반복문 
        sum += a[i];
    avg = sum/size;      // 평균값을 구해서 avg로 넘겨주는 코드 
    return true;
}
 
int main() {
    int x[] = {0,1,2,3,4,5};
    int avg;
    if(average(x, 6, avg)) cout << "평균은 " << avg << endl;   // avg에 평균이 넘어오고 average()에 true가 리턴됨니다 
    else cout << "매개 변수 오류" << endl;
 
    if(average(x, -2, avg)) cout << "평균은 " << avg << endl;  // avg 값은 의미가 없고 average()에 false가 리턴됩니다. 
    else cout << "매개 변수 오류 " << endl;
    
    system("pause");
}
 
cs
실행결과



3. 객체복사할때 복사생성자가 실행된다.

   Circle src(30);

   Circle dest(src);  // 객체복사가 됨.

   -> 복사생성자가 호출된다. Circle (Circle& c)구현해서 사용한다.

   -> 복사생성자가 구현x

   -> 디폴트복사생성자가 컴파일러에 의해서 호출된다.

   (1) 얕은 복사 : 개념, 예제5-10 디폴트 복사생성자를 사용한 예.

                     - 개념: 얕은 복사는 객체를 복사하지만 원본과 메모리를 공유하는 문제를 가지고 있는 방식입니다.

  복사 생성자를 구현하지 않을시 컴파일러는 알아서 디폴트복사생성자를 구현하는데 디폴트복사생성자는 얕은 복사를  하는 생성자 입니다.

                              얕은 복사의 경우 사본객체에서 데이터를 변경시 원본의 데이터 역시 변경되는 단점을 가지고 있습니다.

                              

1
2
3
4
Person::Person(Person& p) {
    this->id = p.id;
    this->name = p.name;
}
cs

   (2) 깊은 복사 : 개념, 예제5-11 디폴트 복사생성자를 사용한 예

                     - 개념: 깊은 복사는 얕은 복사와는 달리 원본과 같으면서 원본의 메모리까지 복사하는 방식입니다.

                              얖은 복사와는 달리 독립적인 메모리를 가지고 있으므로 얕은 복사와 같은 문제가 발생하지 않습니다.

   

1
2
3
4
5
6
7
Person::Person(Person& person) {
    this->id = person.id;
    int len = strlen(person.name);
    this->name = new char [len+1];
    strcpy(this->name, person.name);
    cout << "복사 생성자 실행. 원본 객체의 이름 " << this->name << endl;
}
cs




'객체지향 프로그래밍' 카테고리의 다른 글

7. 상속  (0) 2016.11.15
6. 함수중복과 static멤버  (0) 2016.11.11
4. 객체포인터와 객체배열, 객체의 동적생성  (0) 2016.10.11
3. 클래스와 객체  (0) 2016.09.20
2. C++ 프로그래밍의 기본  (0) 2016.09.09
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함