C++ 기본생성자(default constructor) 와 생성자 오버로딩
C++ 객체의 Default 생성자, 생성자 오버로딩
Default 생성자
Default 라는 뜻은 “기본” 입니다. 어떤 조건을 쓰지 않고 Class 객체를 초기화 할 때는 바로 Default 생성자가 호출 되게 됩니다. 이 Default 생성자는 입력값을 하나도 가지지 않는 생성자인데요,
클래스에 생성자에 대한 정의를 하지 않는 경우에 컴파일러가 자동으로 생성해주는 생성자 입니다.
참고로 클래스를 생성할 때 생성자와 소멸자를 정의할 수 있습니다.
예를 들어 Person이라는 class를 생성하면 생성자는 Person(); 소멸자는 ~Person(); 형식으로
표현합니다.
위에서 알려드린 Person class로 예를 들어 디폴트 생성자를 알아보겠습니다.
먼저 Default 생성자를 선언하지 않은 경우에는 컴파일러가 이런식으로 Default 생성자를 추가해줄 거에요, 실제로 어떻게 선언되는지 확인은 안해보았습니다만, 아래와 같이 Person(){} 처럼 껍데기만 존재하는 형태로 추가 될 거로 생각 됩니다.
class Person {
int age;
std::string name;
public:
//Default 생성자 명시하지 않은 경우에..
//Person(){}
void Print_data();
};
디폴트 생성자를 명시하는 경우에 이런식으로 초기화 될 수 있도록 설정할 수 있습니다.
#include <iostream>
class Person {
int age;
std::string name;
public:
//Default 생성자
Person(){
std::cout << "Default constructor" << std::endl;
age = 30;
name = "Codingsalad";
}
void Print_data();
};
void Person::Print_data(void){
std::cout << "AGE = " << age << " Name is " << name << std::endl;
}
int main(){
Person codingsalad = Person(); // codingsalad라는 Person 클래스 생성 -> 생성자 호출 됨
codingsalad.Print_data(); // codingsalad라는 객체의 Print_data() 호출
return 0;
}
실행한 결과를 확인해 보면 이렇습니다.
클래스를 생성할 때 호출 생성자가 호출 되며, Default 생성자에서 설정한 대로 age = 30, name = “codingsalad”가 잘 들어가 있는 것을 볼 수 있네요.
C++11 이후에 버전에서 위와 같이 디폴트 생
성자를 사용하고 싶을 경우에는 이렇게 사용할 수 있습니다.
이렇게 해두면 생성자를 일부러 정의 안한 것인지, Default 생성자를 사용한 것인지 알 수 있습니다.
Class Test {
public:
Test() = deafult; //default 생성자임을 알려줌
};
C++11 이전 버전에서 Default생성자를 사용하려면 무조건 기입하지 않아야 했는데, 이 경우에는 코드 짠 개발자의 의도를 쉽게 알 수 없었기 때문에 추가된 것이라고 합니다.
생성자 오버로딩
이전에 오버로딩을 배웠던것을 기억하시죠?
생서자에 대해서도 오버로딩을 할 수 있습니다. Person() 생성자에 입력 값을 전달해주도록 작성하면 되는 거에요!
#include <iostream>
class Person {
int age;
std::string name;
public:
//Default 생성자
Person(){
std::cout << "Default constructor" << std::endl;
age = 30;
name = "Codingsalad";
}
// 입력 값이 있는 경우의 생성자 오버로딩
Person(int _age, std::string _name){
std::cout << "constructor include _name,_name" << std::endl;
age = _age;
name = _name;
}
void Print_data();
};
void Person::Print_data(void){
std::cout << "AGE = " << age << " Name is " << name << std::endl;
}
int main(){
Person codingsalad = Person(); // codingsalad라는 Person 클래스 생성 -> 생성자 호출 됨
codingsalad.Print_data(); // codingsalad라는 객체의 Print_data() 호출
Person KIM = Person(29,"KIM"); // KIM이라는 클래스 생성 -> 입력값을 받는 생성자가 호출
KIM.Print_data();
return 0;
}