C++에서 클래스 생성자 구현

Jinku Hu 2023년10월12일
  1. 생성자는 무엇이며 C++에서 작동하는 방법
  2. C++에서 오버로딩을 사용하여 여러 클래스 생성자 구현
C++에서 클래스 생성자 구현

이 기사에서는 C++에서 클래스 생성자를 구현하는 방법을 소개합니다.

생성자는 무엇이며 C++에서 작동하는 방법

생성자는 클래스 객체를 초기화하는 방법을 정의하는 특수 멤버 함수입니다. 생성자는 일반적으로 클래스의 데이터 멤버를 초기화하며 클래스 객체가 생성 될 때 실행됩니다. 생성자 함수의 일부 특정 기능은 클래스 자체와 이름이 같고 반환 유형을 가질 수 없다는 것입니다. 일반적으로 클래스에는 서로 오버로드하는 여러 생성자가 있지만 매개 변수의 수나 유형이 달라야합니다.

생성자는 사용자가 약간 복잡한 클래스에서 명시 적으로 지정하는 경우가 많습니다. 여전히 기본 생성자는 사용자가 생성자를 정의하지 않을 때 컴파일러에 의해 자동으로 생성됩니다. 기본 생성자는 일반적으로 인수가없는 생성자이며 클래스의 기본 초기화를 위해 호출됩니다. 그러나 컴파일러에서 생성 한 기본 생성자는 공식적으로 합성 된 기본 생성자라고합니다. 후자는 데이터 멤버에 따라 각 클래스에 대해 구체적으로 유추되며 클래스 내 이니셜 라이저 또는 기본값을 사용하여 멤버를 초기화합니다. 따라서 자동으로 생성 된 생성자는 범용 솔루션이 아니지만 간단한 클래스 구조에 대해 올바르게 작동합니다.

다음 예제에서는 두 개의 생성자가있는MyClass1클래스를 정의했습니다. 첫 번째는 기본 생성자임을 의미하는 인수를받지 않지만 여전히default키워드를 지정했습니다. 후자는 컴파일러에게이 특정 생성자가 기본 생성자임을 나타냅니다. 일반적으로 컴파일러는 사용자가 생성자를 정의하는 경우 기본 생성자를 생성하지 않습니다. 이 경우 사용자는 지정된 생성자 함수에 대해 명시 적으로default지정을 요청해야합니다.

MyClass1의 두 번째 생성자는 단일string값을 인수로 사용하여name데이터 멤버를 초기화합니다. 특수 문자열 리터럴을cout스트림에 인쇄하여 관찰을 위해 함수 실행 순간을 표시합니다. m2객체 생성은 생성자를 트리거합니다. m1객체는 기본 생성자로 초기화되며 컴파일러 자체가 후자를 생성하므로cout스트림에 인쇄 된 문자열이 표시되지 않습니다.

#include <iostream>
#include <utility>

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

class MyClass1 {
 private:
  string name;
  string nickname;

 public:
  MyClass1() = default;
  explicit MyClass1(string n) : name(std::move(n)) {
    cout << "Constructor 1 is called" << endl;
  };

  string getName() { return name; }

  string getNickname() { return nickname; }

  ~MyClass1() { cout << "Destructor is called" << endl; }
};

int main() {
  MyClass1 m1{};
  cout << m1.getName() << endl;
  cout << m1.getNickname() << endl;
  cout << "------------------" << endl;

  string n1("Maude");
  MyClass1 m2(n1);
  cout << m2.getName() << endl;
  cout << m2.getNickname() << endl;
  cout << "------------------" << endl;

  return EXIT_SUCCESS;
}

출력:

------------------
Constructor 1 is called
Maude

------------------
Destructor is called
Destructor is called

C++에서 오버로딩을 사용하여 여러 클래스 생성자 구현

MyClass1에는nickname이라는 두 번째string 데이터 멤버가 있습니다. 단일 ‘문자열’값을 받아서 ‘닉네임’을 초기화하도록 정의하는 다른 생성자를 생성한다고 가정 해 보겠습니다. 이 경우 컴파일러는 동일한 매개 변수로 함수를 오버로드 할 수 없다는 오류를 발생시킵니다. 따라서 다른 생성자를 정의해야합니다. 예를 들어 두 개의 ‘문자열’참조를 사용하고 두 데이터 멤버를 초기화하는 생성자를 선택했습니다. 다음 코드 조각이 실행되면 두 번째 생성자가 실행되었음을 알 수 있습니다.

생성자는 훨씬 더 자세한 특성을 가지고 있으며이 기사에서는 주요 기능 만 소개했습니다. 다른 특수 함수에는 move-constructor 및 copy-constructor와 같이 이름에-constructor라는 단어가 포함되어 있습니다. 이 두 가지는 집합 적으로복사 제어라고하는 특수 작업의 일부입니다. 소멸자는 생성자가하는 일과 반대로 수행합니다. 즉, 클래스 멤버의 할당을 해제하고 일반적으로 개체가 범위를 벗어날 때 자동으로 호출됩니다. 주어진 코드 조각으로 생성자-소멸자 호출 동작을 쉽게 관찰 할 수 있습니다.

#include <iostream>
#include <utility>
#include <vector>

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

class MyClass1 {
 private:
  string name;
  string nickname;

 public:
  MyClass1() = default;
  explicit MyClass1(string n) : name(std::move(n)) {
    cout << "Constructor 1 is called" << endl;
  };

  // ERROR: Does not Compile
  //    MyClass1(string nk) : nickname(nk) {
  //        cout << "Constructor 3 is called" << endl;
  //    };
  MyClass1(string &n, string &nk) : name(n), nickname(nk) {
    cout << "Constructor 2 is called" << endl;
  };

  string getName() { return name; }

  string getNickname() { return nickname; }

  ~MyClass1() { cout << "Destructor is called" << endl; }
};

int main() {
  string n1("Maude");
  string n2("Bibi");

  MyClass1 m4(n1, n2);
  cout << m4.getName() << endl;
  cout << m4.getNickname() << endl;
  cout << "------------------" << endl;

  return EXIT_SUCCESS;
}

출력:

Constructor 2 is called
Maude
Bibi
------------------
Destructor is called
Destructor is called
작가: 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