C++의 오버로드된 생성자

Jinku Hu 2023년10월12일
C++의 오버로드된 생성자

이 기사에서는 C++에서 오버로드된 생성자를 구현하는 방법을 설명합니다.

C++의 생성자 기본 및 생성자 오버로딩

생성자는 클래스의 개체를 초기화하는 작업을 수행하는 C++ 클래스의 특수 멤버 함수입니다. 생성자는 특별한 이름이 없고 직접 호출할 수 없지만 주어진 클래스가 생성될 때마다 해당 생성자가 일반적으로 호출됩니다. 하지만 클래스 자체와 동일한 이름으로 생성자를 선언합니다. C++는 주어진 범위에서 동일한 이름을 가진 여러 함수를 정의하는 방법을 제공하므로 단일 클래스에 대해 여러 생성자를 정의할 수도 있습니다.

함수 오버로딩 규칙은 오버로드된 생성자와 유사하게 적용되는데, 이는 그들이 허용하는 매개변수 또는 유형의 수가 달라야 하기 때문입니다. C++는 종종 특정한 사용 사례가 있는 다양한 유형의 생성자를 지정하지만 광범위한 범위 때문에 이 기사에서 이러한 세부사항을 탐구하지 않을 것입니다.

다음 예제 코드에서는 string 유형의 private 데이터 멤버 2개를 포함하여 Student 클래스가 정의됩니다. 이 멤버들은 Student 클래스의 새 인스턴스를 생성할 때 초기화되어야 하지만 name 멤버만 필수라고 가정하겠습니다. 결과적으로 우리는 이 클래스의 객체를 생성하기 위해 다른 메소드가 필요하며 그 중 하나는 name 멤버만 초기화합니다.

따라서 하나의 string 매개변수만 사용하고 해당 메시지를 콘솔에 출력하는 첫 번째 생성자를 정의합니다. 후자의 단계는 생성자의 동작을 쉽게 식별하는 데만 사용됩니다. 또한 두 개의 string 매개변수를 허용하고 namelast_name 데이터 멤버를 모두 초기화하는 두 번째 생성자를 정의합니다.

#include <iostream>

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

class Student {
 private:
  string name;
  string last_name;

 public:
  explicit Student(string n) : name(std::move(n)) {
    cout << "Constructor 1 is called" << endl;
  };
  Student(string &n, string &ln) : name(n), last_name(ln) {
    cout << "Constructor 2 is called" << endl;
  };

  string getName() { return name; }

  string getLastName() { return last_name; }
};

int main() {
  string n1("James");
  string n2("Kale");

  Student s1(n1, n2);
  cout << s1.getName() << endl;
  cout << s1.getLastName() << endl;
  cout << "------------------" << endl;

  Student s2(n1);
  cout << s2.getName() << endl;
  cout << s2.getLastName() << endl;
  cout << "------------------" << endl;

  return EXIT_SUCCESS;
}

출력:

Constructor 2 is called
James
Kale
------------------
Constructor 1 is called
James

------------------

main 프로그램에서 s1 객체를 생성할 때 두 개의 인수를 제공했기 때문에 두 번째 생성자가 호출되고 s2가 초기화되면 첫 번째 생성자가 호출됩니다. 이 경우 매개변수 수가 다른 두 개의 생성자가 있었지만 일반적으로 매개변수의 개수가 같고 유형이 다른 두 개의 생성자를 정의할 수 있습니다.

작가: 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