[OODP] 9. Classes and Dynamic Memory Allocation

POSTECH OODP Lecture at 24SS

Dynamic Memory and Classes

Special Member Functions

default constructor, default destructor, copy constructor, asignment operator, address operator

class String
{
public:
    String(const char *s);  // constructor
    String();               // default construuctor
    ~String();              // destructor

    // friend function
    friend ostream &operator<<(ostream &os, const String &st); 
}

Copy Constructors

새로운 객체에 기존 객체를 복사할 때 사용한다.

// What default copy constructor does: shallow copy
String::String(const String& s) { str = s.str; len = s.len; }

String motto("HOHO");
String ditto(motto);
String metoo = motto;
String also = String(motto);
String *pstring = new String(motto);

위 코드에서는 copy constructor가 metoo는 motto의 주소를 가리키는 shallow copy를 수행한다. motto와 metoo의 destructor가 동작하면, 이미 해제된 메모리를 참조하는 metoo의 destructor에서 core dump가 발생하게 될 것이다.

// Fixing the Problem by Defining an Explicit Copy Constructor
String::String(const String &st) // copy constructor
{
    len = st.len;
    str = new char[len + 1];
    std::strcpy(str, st.str);
    num_strings++;
    cout << num_strings << ": \"" << str << "\" object created\n";
}

위와 같이 copy constructor을 수정하여 deep copy를 수행해야 한다.

Assignment Operators

Copy Constructor와 마찬가지로, default로 shallow copy를 지원하기 때문에 별도로 구현해줄 필요가 있다.

String &operator=(const String &st);

String &String::operator=(const String &st)
{
    if(this == &st) // object assigned to itself
        return *this;
    delete[] str;
    len = st.len;
    str = new char[len + 1];
    std::strcpy(str, st.str);
    return *this;
}

Questions?

Q1. nonmember function이 뭔가요?
A1.

Q2.
A2.