c++

c++ 생성자(constructor)

isaacagent 2024. 1. 10. 21:51
728x90
#include <iostream>

class A {
public:
    A();
};
A::A() {
    printf("기본생성자입니다\n");
}

int main()
{
    A t;
}

 

생성자는 한 마디로 초기화라고 생각하면 된다.

선언은 클래스 명과 동일하여야 하고, 리턴값은 없다.

 

이미지1의 실행 시 결과 값

 

#include <iostream>

class A {
public:
    A();
    A(int);
    A(int, int);
};
A::A() {
    printf("기본생성자입니다\n");
}
A::A(int a) {
    printf("매개변수가 int인 생성자입니다\n");
}
A::A(int a, int b) {
    printf("int형 매개변수가 두 개인 생성자입니다.\n");
}

int main()
{
    A t1;
    A t2(1);
    A t3(1,2);
}

생성자의 형태의 따라서도 초기화 방식이 각기 다르게 적용된다.

이미지2의 실행 시 결과 값

 

main에서 기본 생성자를 불러올 때 주의를 해야할 점이 있다.

int main()
{
    A t1();
}

 

변수명에 소괄호를 붙여서 선언 시에 

 

해당 문구가 뜨면서 console 창에는 원하는 초기화가 일어나지 않았을 것이다.

 

그 이유는

 

해당 main에 적힌 "A t1()" 이 생성자를 호출을 하는 것인지, 함수를 선언하기 위해 작성된 것인지 확실하지 않기 때문에 코드가 동작하지 않는 것이다.

 

자료형 function();

기본적인 함수 형태는 이러한 형식을 따른다.

 

생성자 호출과 함수 선언의 형태가 동일한 형태를 이루고 있기 때문에 프로그램이 혼동이 오게 되어 결과 값이 뜨지 않는 것이 그 이유이다.

 

그러므로 생성자 호출 시에는 소괄호를 사용하지 않도록 주의하자.

 

#include <iostream>

class A {
private:
    int data;

public:
    void setData(int);
    int getData();
};

void A::setData(int a) {
    data = a;
}
int A::getData() {
    return data;
}

int main()
{
    A t1;
    printf("%d\n", t1.getData());
}

 

기본 생성자가 없는 경우 일 때,

해당 결과 값은 data 값을 요구를 한다.

하지만 setData로 data에 넣은 값이 없기 때문에 

이러한 결과값이 나온다.

 

하지만 main의 생성자 호출에 중괄호를 붙일 시,

int main()
{
    A t1{};
    printf("%d\n", t1.getData());
}

 

기본적인 생성자의 값을 0으로 초기화 시켜버린다.

 

만약 기본 생성자를 선언을 했을 시에는 기본 생성자에 적힌 대로 따라가며, 해당 중괄호를 붙이더라도 0으로 초기화 되는 기능은 없다.

 

기본 생성자를 선언 했을 시, 0으로 초기화 하는 방법은 해당 생성자에서 직접 0으로 초기화를 하는 방법 밖에 없다.

 

 

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

C++ 동적 할당  (0) 2024.01.17
c++ 복사 생성자 관련  (0) 2024.01.15
Call by value 와 Call by reference  (0) 2024.01.15