참조
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 & 함수()
첫번째 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
함수
출력결과
호출되는 순서를 확인하고 각 가리키는 주소값이 틀리다는 것을 확인
위 소스코드에 있는 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를 비교함으로써 자신에게 대입했는지를 검사한다.