[C++] CPP-Module-02

dandb3·2023년 7월 3일
0

C++

목록 보기
2/3

Orthodox Canonical Form?

클래스에 있는 다음 4개의 method를 의미한다.

  • Default constructor
  • Copy constructor
  • Destructor
  • Copy assignment operator

ex)

class A final
{
   public:
      A ();
      A (const A &a);
      ~A ();
      A & operator = (const A &a);
};

나머지는 다 OK.
copy assignment operator는 주목할 필요가 있다.

확인해야 할 점?

  1. 리턴 값이 왜 굳이 A&인가?
    • 일단 문법적으로 a = b = c와 같은 표현이 정상적으로 동작하는 것을 권장하므로, void 형이나 다른 자료형이 아닌 A 클래스로 리턴을 해야 한다.

    • 그러면 A로 리턴하면 되지, 왜 굳이 A&로 함?

    • 위의 경우를 다시 보면, 만약 A로 리턴하는 경우, a = b = c를 사용하게 된다면,

      1. b 에다가 c를 할당.
      2. b = c 연산자가 종료되면서 새로운 A클래스의 객체가 생성됨.
      3. a에다가 새로 생성된 객체를 할당.
      4. 할당이 끝났으니 새로 생성된 객체는 없어짐.(소멸자 호출)

      당장 이 경우만 보더라도 2, 4의 과정이 추가되었다.
      더 많은 할당 chain이 이루어질 경우, 성능 저하가 발생한다.

  2. A a = b;와 같이 쓰였을 경우?
    Q. 복사 생성자가 호출되는가, 아니면 복사 할당 연산자가 호출되는가?
    A. 복사 생성자가 호출된다. (A a = b;의 경우 실제 정의가 이루어지는 부분이기 때문에 = 연산자가 쓰였을지라도 실제로는 복사 생성자가 호출된다.)
    Q. 그러면 다음과 같은 형태들은 어떻게 동작함?
    //1. b는 A 클래스의 객체
    A a = b;
    //2. A 클래스의 생성자에 std::string이 인자로 들어오는 경우
    A a = "eng";
    //3. rvalue? 값이 들어온 경우 - 1
    A a = A();
    //4. rvalue? 값이 들어온 경우 - 2
    A a(A());
    .
    .
    .

지금은 너무 귀찮다. 2번에 대해서는 나중에 추가할 예정.

참고 자료

profile
공부 내용 저장소

0개의 댓글