본문 바로가기

카테고리 없음

c++ 기초단계 (11/17)

참조

c++에서도 보통은 값에 의해 매개변수를 전달하지만 때때로 매개변수를 참조에 의해 전달할 필요가 있다.

c++만의 새로운 매개변수 전달 방법이다. 참조에 의한 전달은 인자값이 복사되지 않는다. 대신에 매개변수는 그 인자값의

알리아스가 된다. 즉, 인자와 매개변수는 같은 기억장소를 참조하게 된다.

따라서 매개변수의 값을 변화시키면 인자의 값도 변하게 된다.

참조는 포인터와 유사하지만 좀 틀리다.

 

void test1(int & r)    //test1()은 참조에 의해 int형을 받는다.

{

    r = 5;

}

main()

{

    int a = 3;      // test1()을 호출하기 전엔 a는 3

    test1(a);     //참조에 의해 a가 test1()에 전달된다.

}

return에 후에 a가 5가 된다.

r의 선언에서 &(참조)기호는 r을 값의 매개변수가 아닌 참조 매개변수로 바꿔준다.

 

&로 참조를 선언하는 것은 *로 포인터를 선언하는 것과 같은 구문을 가진다

예) void test(int & r);         // r은 int에 대한 참조이다.

 

참조의 단점

-  초기화 할 때 들어간 값은 변하지 않는다.

  char * const a = &b; //a가 가리키는  b의 값은 못바꾼다.

 

 

복사생성자

class emb

{

    public :

        int a;

        int b;

        int c;

        int d;

        char *e;

    emb()          <---- 디폴트 생성자

    {

        a = 50;

        b = 50;

        c = 50;

        d = 50;

        e = (char*)malloc(sizeof(“test”));

   }

    emb(emb &kkk)          <---- 복사 생성자

    {

    }

 

 

복사생성자의 이름은 디폴트 생성자와 같고, 매개변수를 갖는 것은 대입연산자와 같다.

복사생성자는 하나의 객체가 같은 클래스의 다른 객체로부터 생성될 때 구동된다.

int main()

{

    emb test1;

    emb test2;

    emb test3 = test1;

    emb test4(test1);

    …

}

 

처음보는 int & 함수()

1

 

1_00000 

첫번째 101은 당연히 ++a;가 있으니 a값에서 1이 더해진 101이 출력

변수에 함수를 대입..첨보는 식…

int k = test();  k에 101값이 들어가는군…

 

두번째 나오는 51은 함수에 함수를 대입

역시 첨보는 식

test() = test2();

test2();에 있는 a는 50이란 값을 가지고 있다. 50값을 test()로 보내 a++을 하니 51이 출력

이해가 100% 되지않아 그냥 외우기로 했다.

 

마지막 101은 test3(k);

test3();에 a를 출력하라고 하였으니 k의 값에 들어갔던 101이 출력…

이것도 역시 외우련다…

 

main()함수내에 코드를 주석처리하고 

test3(test()); 을 살려 출력하면

값은 101.. 이건 예상한 결과다.

 

////////////////////////////////////////////////////////////////////////////////////////////////////

class emb

11 

함수

11_00000 

출력결과

11_00001

 

호출되는 순서를 확인하고 각 가리키는 주소값이 틀리다는 것을 확인

 

위 소스코드에 있는 class emb에게 상속을 받는 class IT 생성하고

출력해보자.

 

대입연산자

a = b;

a의 입장에서 보면 void = (b);

 

C프로그램에서 보면 대입연산자가 대부분의 구조체에서 사용될 수 없을을 인정한다.

그래서 그런 경우엔 대입을 다루기 위해 주로 copy()나 혹은 이와 비슷하게 이름 지어진 함수를 생성한다.

그러나 c++에서는 대입의 구문을 사용하여 copy()함수 호출의 유연성을 얻을 수 있다.

class emb

{

    public :

        void operator = (int & r);     //대입에 의해 구동

}

이 새로운 멤버 함수의 이름은 operator=이다. 즉, 키워드 operator 뒤에 대입 연산자가 온다.

이 함수는 한개의 매개변수를 갖는다. 즉, 이 함수가 멥버로 속하는 클래스의 객체에 대한 참조 매개변수이다.

 

a = a;

a에 a를 대입한다?

이게 틀린것은 아니지만 최적화로 치자면 아주 불필요한짓이다.

이것을 방지하기 위해

if(&r == this)

{

    return;

}

을 넣어준다. 이렇게 하면 r의 주소와 this를 비교함으로써 자신에게 대입했는지를 검사한다.