C++ Chapter 8.13 : 익명 객체

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


chapter 8. 객체 지향의 기초 : 익명 객체

🔔 익명 객체를 사용하는 경우

class A
{
public:
    void print()
    {
        cout << "Hello" << endl;
    }
}

int main()
{
    A a;
    a.print();
}
  • A 타입의 객체는 멤버로 print() 함수 하나만 가지고 있기 때문에
    • 이 함수를 사용할 때마다 A a; 객체를 생성해주어야 하는 과정이 번거롭다.
    • 어차피 print() 함수 하나만 쓸텐데.. 😥


🔔 익명 객체 사용하기

그냥 생성자만 호출하면 되고 바로 .으로 멤버를 호출하면 된다.

A().print();
  • A().print();
    • A()
      • 이름 없는 A 타입의 익명 객체가 생성 됐다.
      • 매개 변수 없는 디폴트 생성자를 호출하고 있다.
      • 이 익명 객체로 print() 멤버 함수를 호출하고 있다.


🔔 익명 객체 특징

  • 익명 객체는 R-Value로서 작동한다.
    • 따라서 익명 객체는 생성되고 멤버를 호출한 후 실행이 끝나자마자 바로 사라진다.
  • 아래 두 개의 a.print() 는 둘 다 a 객체에서 호출된 것이다.
    • a의 생성자만 한번 호출된다.
      A a;
      
      a.print();
      a.print();
      
  • 아래 두 개의 A().print()각자 다른 객체에서 호출된 함수다.
    • 첫번째 A().print()
      • 익명 객체 A()가 생성되면서 생성자가 한번 호출되고
      • A().print() 의 실행이 끝나자마자 익명 객체 A()의 소멸자가 호출되고 메모리 해제된다.
    • 두번째 A().print()
      • 익명 객체 A()가 생성되면서 생성자가 한번 호출되고
      • A().print() 의 실행이 끝나자마자 익명 객체 A()의 소멸자가 호출되고 메모리 해제된다.
    • 총 두 번의 생성자, 두 번의 소멸자가 호출된다.
      A().print();
      A().print();
      


🔔 예제

class Cents
{
private:
   int m_cents;

public:
   Cents(int cents) {m_cents = cents;}  // Cents 클래스의 생성자 

   int getCents() const {return m_cents;}  // Cents 클래스의 멤버 함수
};


Cents add(const Cents &c1, const Cents &c2)    // 일반 함수
{
  return Cents(c1.getCents() + c2.getCents());  // 익명 객체 리턴
}


int main()
{
  cout << add(Cents(6), Cents(8)).getCents() << endl; // 익명객체 

  return 0;
} 
cout << add(Cents(6), Cents(8)).getCents() << endl;
  • 일반 함수 add 는 Cents 타입의 객체 2 개를 매개변수로 받아 Cents 타입의 R-value로 익명 객체를 리턴하는 함수다.
    • Cents(6), Cents(8) 2개의 익명 객체를 매개 변수로 넘겨
      • 매개변수 1개짜리 생성자를 호출했다.
    • 결과 값을 리턴받는데
      • Cents(c1.getCents() + c2.getCents()) 를 리턴 받으므로 리턴값 또한 익명객체다.
  • 리턴된 Cents 타입의 익명 객체로 *getCents()*를 호출한다.


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기


댓글남기기