C++

c++클래스(2)

Barbarian developer 2024. 9. 25.

생성자 예제

#include <iostream>
using namespace std;

class SimpleClass
{
private:
    int num1;
    int num2;

public:
    // 기본 생성자: num1과 num2를 0으로 초기화
    SimpleClass()
    {
        num1 = 0;
        num2 = 0;
    }

    // 하나의 매개변수를 받는 생성자: num1을 주어진 값으로 설정하고, num2는 0으로 초기화
    SimpleClass(int n)
    {
        num1 = n;
        num2 = 0;
    }

    // 두 개의 매개변수를 받는 생성자: num1과 num2를 각각 주어진 값으로 설정
    SimpleClass(int n1, int n2)
    {
        num1 = n1;
        num2 = n2;
    }

    // num1과 num2의 값을 출력하는 함수
    void ShowData() const
    {
        cout << num1 << " " << num2 << endl;
    }
};

int main(void)
{
    // 기본 생성자를 사용하여 객체 생성
    SimpleClass sc1;
    sc1.ShowData();  // num1 = 0, num2 = 0 출력

    // 하나의 매개변수를 받는 생성자를 사용하여 객체 생성
    SimpleClass sc2(100);
    sc2.ShowData();  // num1 = 100, num2 = 0 출력

    // 두 개의 매개변수를 받는 생성자를 사용하여 객체 생성
    SimpleClass sc3(100, 200);
    sc3.ShowData();  // num1 = 100, num2 = 200 출력

    return 0;
}

<출력문>

0 0
100 0
100 200

 

 

  • 기본 생성자: 매개변수가 없을 때 num1과 num2를 0으로 초기화합니다.
  • 하나의 매개변수를 받는 생성자: num1에 주어진 값을 설정하고 num2는 0으로 설정합니다.
  • 두 개의 매개변수를 받는 생성자: num1과 num2에 각각 주어진 값을 설정합니다.
  • ShowData 함수는 num1과 num2의 값을 출력하는 역할을 합니다.
  • main 함수에서는 각각 다른 생성자를 이용해 객체를 생성한 후, 각 객체의 num1과 num2 값을 출력합니다.
  • 이 예문을 통해 생산자를 오버로딩이 가능하다는 사실을 확인 할수 있습니다.

디폴트 생성자

디폴트 생성자의 특징

 

  • 암시적 생성: 사용자가 클래스에 어떤 생성자도 정의하지 않으면 컴파일러가 자동으로 디폴트 생성자를 생성합니다.
  • 기본 초기화: 컴파일러가 생성한 디폴트 생성자는 멤버 변수를 기본값으로 초기화합니다. (예: 숫자 타입은 0, 포인터는 nullptr)
  • 명시적 정의: 사용자가 직접 디폴트 생성자를 정의할 수도 있습니다. 이 경우 멤버 변수를 원하는 값으로 초기화하거나 추가적인 작업을 수행할 수 있습니다.
#include <iostream>

class MyClass 
{
public:
    int value;

    // 명시적으로 정의한 디폴트 생성자
    MyClass() : value(10) 
    { 
        std::cout << "디폴트 생성자 호출!" << std::endl; 
    }
};

int main() 
{
    MyClass obj; // 디폴트 생성자 호출
    std::cout << obj.value << std::endl; // 출력: 10

    return 0;
}

 

 

 

디폴트 생성자를 사용하는 이유

  • 간편한 객체 생성: 객체를 생성할 때 매번 인자를 전달할 필요 없이 간편하게 객체를 생성할 수 있습니다.
  • 일관성 유지: 멤버 변수를 특정 값으로 초기화하여 객체의 상태를 일관되게 유지할 수 있습니다.
  • 유연성 확보: 디폴트 생성자를 제공함으로써 객체를 생성하는 다양한 방법을 제공할 수 있습니다.
#include <iostream>
using namespace std;

class AAA
{
private:
    int num;

public:
    // 기본 생성자: num을 0으로 초기화
    AAA() : num(0) {}

    // 객체를 생성하고 초기화한 후 참조를 반환하는 함수
    AAA& CreateInitObj(int n) const
    {
        AAA* ptr = new AAA(n); // 동적으로 n을 매개변수로 객체 생성
        return *ptr;           // 생성한 객체의 참조를 반환
    }

    // num 값을 출력하는 함수
    void ShowNum() const
    {
        cout << num << endl;
    }

private:
    // 매개변수 n을 받아 num을 초기화하는 private 생성자
    AAA(int n) : num(n) {}
};

int main(void)
{
    // 기본 생성자를 사용하여 객체 생성
    AAA base;
    base.ShowNum();  // num = 0 출력

    // CreateInitObj 함수를 사용하여 새로운 객체 생성 및 초기화
    AAA& obj1 = base.CreateInitObj(3);
    obj1.ShowNum(); // num = 3 출력

    AAA& obj2 = base.CreateInitObj(12);
    obj2.ShowNum(); // num = 12 출력

    // 동적으로 생성된 객체들은 delete로 메모리 해제 필요
    delete &obj1;
    delete &obj2;

    return 0;
}

<출력문>

0
3
12

 

클래스에서의 객체 배열

#include <iostream>
#include <cstring>
using namespace std;

class Person
{
private:
    char *name;
    int age;

public:
    // 생성자: 이름과 나이를 초기화
    Person(char *myname, int myage)
    {
        int len = strlen(myname) + 1;
        name = new char[len];
        strcpy(name, myname);
        age = myage;
    }

    // 기본 생성자
    Person()
    {
        name = NULL;
        age = 0;
        cout << "called Person()" << endl;
    }

    // Person 정보 설정
    void SetPersonInfo(char *myname, int myage)
    {
        name = myname;
        age = myage;
    }

    // Person 정보 출력
    void ShowPersonInfo() const
    {
        cout << "이름: " << name << ", ";
        cout << "나이: " << age << endl;
    }

    // 소멸자: 동적 할당 메모리 해제
    ~Person()
    {
        delete[] name;
        cout << "called destructor!" << endl;
    }
};

int main(void)
{
    // Person 객체 배열 선언
    Person parr[3];
    char namestr[100];
    char *strptr;
    int age;
    int len;

    // 사용자로부터 이름과 나이 입력을 받아 Person 객체 초기화
    for (int i = 0; i < 3; i++)
    {
        cout << "이름: ";
        cin >> namestr;
        cout << "나이: ";
        cin >> age;

        len = strlen(namestr) + 1;
        strptr = new char[len];
        strcpy(strptr, namestr);
        parr[i].SetPersonInfo(strptr, age);
    }

    // Person 객체 정보 출력
    parr[0].ShowPersonInfo();
    parr[1].ShowPersonInfo();
    parr[2].ShowPersonInfo();

    return 0;
}

<출력문>

called Person()
called Person()
called Person()
이름: 곽성민
나이: 20
이름: 김수현
나이: 21
이름: 임민호  
나이: 20
이름: 곽성민, 나이: 20
이름: 김수현, 나이: 21
이름: 임민호, 나이: 20
called destructor!
called destructor!
called destructor!

객체 포인터 배열

#include <iostream>
#include <cstring>
using namespace std;

class Person
{
private:
    char *name;
    int age;

public:
    // 생성자: 이름과 나이를 초기화
    Person(char *myname, int myage)
    {
        int len = strlen(myname) + 1;
        name = new char[len];
        strcpy(name, myname);
        age = myage;
    }

    // 기본 생성자
    Person()
    {
        name = NULL;
        age = 0;
        cout << "called Person()" << endl;
    }

    // Person 정보 설정
    void SetPersonInfo(char *myname, int myage)
    {
        name = myname;
        age = myage;
    }

    // Person 정보 출력
    void ShowPersonInfo() const
    {
        cout << "이름: " << name << ", ";
        cout << "나이: " << age << endl;
    }

    // 소멸자: 동적 할당 메모리 해제
    ~Person()
    {
        delete[] name;
        cout << "called destructor!" << endl;
    }
};

int main(void)
{
	Person* parr{3];
    char namestr[100]'
    int age;
    
    for(int i=0; i<3; i++)
    {
    	cout<<"이름 : ";
        cin>>namestr;
        cout<<"나이 : ";
        cin>>age;
        parr[i]=new Person(namestr, age);
    }
    parr[0]->ShowPersonInfo();
    parr[1]->ShowPersonInfo();
    parr[2]->ShowPersonInfo();
    delete parr[0];
    delete parr[1];
    delete parr[2];
    return 0;
}

<출력문>

called Person()
called Person()
called Person()
이름: 곽성민
나이: 20
이름: 김수현
나이: 21
이름: 임민호  
나이: 20
이름: 곽성민, 나이: 20
이름: 김수현, 나이: 21
이름: 임민호, 나이: 20
called destructor!
called destructor!
called destructor!

'C++' 카테고리의 다른 글

this 포인터의 이해  (0) 2024.09.26
' : '과 ' :: '의 차이점  (0) 2024.09.26
c++ 참조  (0) 2024.09.25
c++ 클래스  (3) 2024.09.25
vector와 array  (0) 2024.09.25

댓글