디필의 요모조모

명품 C++ Programming 5장 요약 본문

Programming Language/C++

명품 C++ Programming 5장 요약

Diphylleia12 2020. 10. 13. 21:39

<5장 함수와 참조, 복사 생성자>

 

C++의 인자 전달 방식

  • ‘값에 의한 호출’, ‘주소에 의한 호출’, ‘참조에 의한 호출’ 3가지가 있다.
  • 값에 의한 호출시 실인자의 값이 매개 변수에 복사되어 전달되므로매개 변수와 실인자는 메모리를 서로 공유하지 않는다그러므로 함수 내에서 매개 변수의 값을 변경해도 실인자의 값이 바뀌지 않는다객체가 값에 의한 호출로 전달되면 매개 변수 객체의 생성자는 실행되지 않고 소멸자만 실행되는 문제가 발생한다.
  • 참조에 의한 호출은 원본에 대한 참조만 전달되므로 함수 내에서 참조 매개 변수를 이용하여 원본 데이터를 읽고 수정할 수 있다.

객체 치환 및 객체 리턴

  • 치환 연산자(=)로 객체를 치환하면, 비트 단위로 객체가 복사된다.
  • C++ 함수는 객체를 리턴할 수 있다이때 객체의 복사본이 만들어져 리턴된다.

참조(reference)와 함수

  • 참조란 가리킨다란 뜻이며, 참조 변수는 이미 존재하는 변수에 붙여진 별명이다.
  • 참조 변수의 선언으로 변수 이름만 생기고 변수 공간이 할당되지 않는다.
  • 참조는 포인터가 아니며, C++뿐 아니라 PASCAL 등 다른 언어에도 있다.
  • 참조 변수는 참조자(&)를 이용하여 선언되며반드시 기존 변수로 초기화되어야 한다.
  • 참조 타입의 매개 변수를 가진 함수에 대한 호출을 참조에 의한 호출이라고 부른다.
  • C++에서 참조를 리턴하는 함수를 작성할 수 있다.
char& find();     // char 공간에 대한 참조 리턴

 

복사

  • 복사에는 얕은 복사와 깊은 복사와 두 종류가 있다. 얕은 복사는 객체의 멤버를 1:1로 단순 복사하지만, 깊은 복사는 객체의 멤버 포인터가 할당받은 메모리까지 복사하는 완전한 형태의 복사이다.
  • 복사 생성은 객체를 생성할 때 원본 객체를 복사하여 생성하는 것을 말한다.
  • 묵시적으로 복사 생성이 일어나는 경우는 다음 3가지이다.
SampleClass x = y;         // 객체 x가 y로 초기화되어 생성
void f(SampleClass x) {…}         // 함수 f()가 호출되어 객체 x가 생길 때
SampleClass f() { SampleClass x; …; return x; } // 함수가 객체를 리턴할 때

 

복사 생성자

  • 복사 생성자는 객체의 복사 생성 시에 호출되는 특별한 원형의 생성자로서, 하나의 매개 변수만을 가지며, 매개 변수는 클래스에 대한 참조 타입이다.
ClassName(ClassName&);
  • 복사 생성자가 작성되지 않은 클래스의 경우 컴파일러가 디폴트 복사 생성자를 자동 삽입하며디폴트 복사 생성자는 얕은 복사를 실행한다.
  • 클래스에 포인터 변수 멤버가 있는 경우디폴트 복사 생성자와 같이 얕은 복사 생성자를 사용하면 포인터가 가진 메모리를 원본과 사본 객체가 공유하는 문제가 생기고프로그램이 비정상 종료되기도 하므로 깊은 복사 생성자를 반드시 작성하는 것이 좋다.
Comments