Brise

[C++ 기본 2] 8. 생성자 본문

프로그램/C,C++

[C++ 기본 2] 8. 생성자

naudhizb 2022. 3. 2. 23:33
반응형
// 8_생성자1
#include <iostream>

class Point
{
    int x, y;
public:
    // 특징 1. 클래스이름과 동일
    //     2. 반환타입을 표기하지 않는다.
    //     3. 오버로딩 가능(2개 이상 만들수있다.)
    //     4. 객체를 생성하면 생성자가 호출된다.
    //     5. 사용자가 한개도 만들지 않으면 컴파일러가 
    //          인자 없는 생성자를 한개 만들어준다 - 디폴트 생성자
    //Point()             { x = 0; y = 0; std::cout << "Point()" << std::endl; }
    Point(int a, int b) { x = a; y = b; std::cout << "Point(int, int)" << std::endl; }
};

int main()
{
    Point pt1;            // 1
    //Point pt2(0, 0);    // 2
}

C++에서 클래스를 만들 때 생성자를 직접 만들 수 있으며, 만약 생성자를 만들지 않는 경우 컴파일러가 인자가 없는 기본 생성자를 임의로 만들어 준다.

// 8_생성자1
#include <iostream>

class Point
{
    int x, y;
public:
    Point()             { x = 0; y = 0; std::cout << "Point()" << std::endl; }
    Point(int a, int b) { x = a; y = b; std::cout << "Point(int, int)" << std::endl; }
};

int main()
{
    Point pt1;            // 1
    Point pt2(0, 0);    // 2
    Point pt3{ 0, 0 };    // 2번 생성자. C++11의 일관된초기화.
                        // 직접 초기화
    Point pt4 = { 0, 0 }; // 2번, 복사 초기화
    Point arr[5]; // 1번 생성자 5번.

    Point arr2[5] = { Point(0,0), {1,1} }; // 2번 2회호출
                                            // 1번 3회 호출
                    // C++98/03    C++11 스타일

    Point* p; // 객체 아님. 생성자 호출 안됨.

    p = (Point*)malloc(sizeof(Point));  // 생성자 호출안됨.
    free(p);

    p = new Point;  // 메모리 할당 + 1번 생성자 호출 => 객체 생성
    delete p;

    p = new Point(1, 1); // 2번 생성자,  new Point{1,1}
    delete p;
}

C++은 다형성을 지원하기 때문에 같은 함수 이름을 가지면서도 서로 다른 인자로 호출하는 것이 가능하다.
클래스, 클래스 포인터에 따라 생성자 인자의 종류에 따라 실제 불리는 생성자가 다르니 사용 시 주의하여야 한다.

반응형
Comments