C++에서 물결표 연산자를 사용하여 클래스 소멸자 정의

Jinku Hu 2023년10월12일
  1. 물결표 연산자~를 사용하여 C++에서 클래스 소멸자를 선언합니다
  2. C++에서 클래스 개체가 파괴되기 전에 코드 실행
C++에서 물결표 연산자를 사용하여 클래스 소멸자 정의

이 기사에서는 C++에서 물결표 연산자를 사용하여 클래스 소멸자를 정의하는 방법에 대한 여러 방법을 보여줍니다.

물결표 연산자~를 사용하여 C++에서 클래스 소멸자를 선언합니다

소멸자는 클래스 객체의 리소스 할당 해제를 처리하는 특수 멤버 함수입니다. 클래스 생성자와 달리 지정된 클래스에 대해 하나의 소멸자 함수 만 있습니다. 클래스 소멸자는 클래스와 동일한 이름에 접두사~물결표 연산자를 추가하여 선언됩니다.

대부분의 경우 동적 메모리에 할당해야하는 데이터 멤버가있는 경우 클래스의 소멸자를 정의해야합니다. 코드는 소멸자 함수에서 이러한 멤버를 명시 적으로 할당 해제해야합니다. 다음 예제는std::string의 래퍼 인CustomString 클래스를 보여줍니다. 아이디어는str 포인터에 메모리를 할당하는 생성자로 클래스를 정의하는 것인데, 이는 클래스가 소멸자를 정의해야 함을 의미합니다. CustomString에는 두 개의 생성자가 있으며 그중 하나는 복사 생성자입니다.

#include <iostream>
#include <string>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

class CustomString {
 public:
  explicit CustomString(const string &s = string()) : str(new string(s)) {}

  CustomString(const CustomString &p) : str(new string(*p.str)) {}

  ~CustomString() { delete str; }

  string &getString() { return *str; };

 private:
  string *str;
};

int main() {
  CustomString str1("Hello There!");
  CustomString str2(str1);

  cout << "str1: " << str1.getString() << endl;
  cout << "str2: " << str2.getString() << endl << endl;
}

출력:

str1: Hello There!
str2: Hello There!

C++에서 클래스 개체가 파괴되기 전에 코드 실행

이전 방법이 보여준 것처럼 클래스 소멸자는 데이터 멤버의 메모리를 정리합니다. 그러나 클래스 멤버는 종종 프로그램 스택에 선언 된 일반적인 데이터 유형일뿐입니다. 이 경우 소멸자는 프로그래머에 의해 명시 적으로 선언되지 않을 수 있지만 컴파일러는 소위 합성 소멸자를 정의합니다.

일반적으로 클래스 멤버는 소멸자 함수 코드가 실행 된 후에 소멸됩니다. 따라서StringArray 클래스 인스턴스가 범위를 벗어나서 해당 텍스트를 콘솔에 출력하는 방법을 보여줄 수 있습니다.

#include <iostream>
#include <string>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

class StringArray {
 public:
  StringArray() : vec(), init(new int[10]){};
  ~StringArray() {
    delete[] init;
    cout << "printed from destructor" << endl;
  }

  string getString(int num) {
    if (vec.at(num).c_str()) {
      return vec.at(num);
    } else {
      return string("NULL");
    }
  };

  void addString(const string& s) { vec.push_back(s); };

  uint64_t getSize() { return vec.size(); };

 private:
  vector<string> vec;
  int* init;
};

int main() {
  StringArray arr;

  arr.addString("Hello there 1");
  arr.addString("Hello there 2");

  cout << "size of arr: " << arr.getSize() << endl;
  cout << "arr[0]: " << arr.getString(0) << endl;
}

출력:

size of arr: 2
arr[0]: Hello there 1
printed from destructor
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C++ Class