Skip to main content

Command Palette

Search for a command to run...

C++ 클래스 생성자

Updated
2 min read

C++ 생성자/소멸자란?

클래스의 객체가 메모리에 할당되며 생성되고, 삭제되는 과정에서 실행되는 함수이다. 객체를 만드는데 있어 필수적인 함수이기에 따로 정의하지 않아도 컴파일러에서 자동으로 생성한다.

클래스의 객체를 생성할 때, private한 변수를 초기화하고, 초기화 과정을 실행한다. 소멸자의 경우, 한 개밖에 정의가 안되지만, 생성자의 경우, 다양한 방식으로 선언하여 필요에 따라 생성시에 호출할 수 있다.

특징으로는, 함수의 리턴 타입과 리턴 값이 없으며, 함수 이름이 클래스 이름 그 자체이어야 한다.

class CTest
{
public:
    int m_value;
    // 생성자
    CTest()
    {
        m_value = 1;
    }
    //소멸자
    ~CTest()
    {
    }

생성자와 소멸자를 사용자가 직접 정의하는 것을 "명시적 생성자/소멸자 정의" 라고 하며, 컴파일러에서 자동으로 생성하는 것을 "암시적 생성자/소멸자 정의"라고 한다. 여기서 알아야 할 점은, 암시적 정의는 "논리적인"개념일 뿐이다.

자식-부모 관계의 클래스가 있을 때, 자식 클래스의 객체를 선언하면, 자동으로 부모 클래스의 "기본" 생성자가 선처리 영역으로 실행된다.

다음으로, 다양한 클래스의 생성자 정의를 알아보자

복사 생성자

일반적으로 값을 복사해 넣는 것은 다음과 같이 일어난다.

int i = 1;

int j1(i);

int j1; j1 = i;

하지만, 클래스의 복사를 생각하면 어떻게 될까?

CTest t = new CTest;
CTest t1 = t;
CTest t2; t2 = t;

기본 생성자 만으로는 위의 코드를 의도대로 컴파일 하지 못한다. 그래서 필요한 것이 복사 생성자이다. 복사 생성자는 우변에 있는 객체를 그대로 복사하여 새로운 객체에 넣는 것이다.

복사 생성자의 선언

CTest(const CTest& obj) //인자로 클래스 참조 타입을 주면 복사 생성자이다.
{

m_value = 2;

}

컴파일러는 생성자 함수의 인자로 클래스 참조 타입을 주는 것을 보고, 복사 생성자 임을 안다.(const는 선택사항이다). 만약에 위의 복사 코드가 실행된다면, t1.m_value는 복사 생성자의 m_value = 2; 에 의해 2가 출력될 것이다. 또한, 중요한 점은, 복사 생성자가 실행되려면 변수를 선언할 때, 대입을 해야 된다는 점이다. 그로 인해, 세번 째 코드, CTest t2; t2 = t;를 실행하면, 복사 대입이 이루어져, 그냥 t의 멤버 값이 복사되기만 한다.

복사 생성자의 또 다른 특징은, 자식 클래스의 암시적 복사 생성자는, 선처리 영역으로 부모 클래스의 "복사"생성자를 호출한다. 일반적으로, 선처리 영역으로 기본 생성자가 호출되는 것과 차이가 있다. 주의해야 할 점은, 자식 클래스가 명시적 복사 생성자를 가진 경우, 선처리 영역으로 부모 클래스의 기본 생성자가 실행된다.

타입 변환 생성자는 다음 글에서 알아보자

More from this blog

[ZSH] tree 사용하기

들어가며 큰 규모의 프로젝트를 출시한 뒤, 후일을 위해서 더 늦기 전에 파일 정리 및 문서화를 진행해야했다. 문서화 작업을 하는 중에 기왕 정리하는 거 파일 구조를 이쁘게 트리 구조로 나열하여 코멘트를 달면 나중에 보더라도 이해하기 더 쉬울 것 같았다. 어떻게 해야 간지나는 트리 구조를 만들 수 있을까 방법을 찾다보니 역시나 파일 구조를 트리로 이쁘게 출력해주는 커맨드 툴이 존재했다. tree 커맨드에 대해서 알아보고 알짜배기 내용만 정리했다....

Feb 21, 20242 min read

[Next.js] parallel routes & intercepting routes

트위터 로그인 모달창을 만들어보며 넥스트의 parallel routes 와 intercepting routes 을 학습한 내용을 정리해보았습니다. 트위터 로그인 창을 확인해봅시다. 루트 디렉토리 화면을 배경으로 i/flow/login 페이지가 동시에 표시되고 있습니다. 저는 app router 를 학습하기 전까지는 createPortal 을 사용하여 포탈 영역에 로그인 컴포넌트를 띄우는 방식을 사용했었습니다. const NoLogin =()=...

Feb 1, 20244 min read

C/C++ 이진 트리(binary tree) 개요 및 구현(1)

개요 트리는 노드들이 나무 가지처럼 연결된 비선형 계층적 자료구조이다. 하위 트리가 존재하고, 그 노드에 또 하위 트리가 존재하는 자료구조 이다. 트리의 맨 위에 있는 루트 노드가 존재한다. 우리가 알아볼 트리는 이진 트리이다. 이진 트리는 자식 노드(부모로부터 아래로 이어진 노드)가 2개 이하인 구조를 말한다. 트리의 사용 사례로는 다음과 같다 계층 적 데이터 저장(파일,폴더) 효율적인 검색 속도 힙 데이터 베이스의 인덱싱 트리에 ...

Jan 31, 20244 min read

[React] Server component (RSC)

React.js 18 에 도입된 리액트 서버 컴포넌트는 서버에서 동작하는 리액트 컴포넌트를 의미합니다. Next가 권장하는 라우팅 방식인 app router의 기반이 되는 컴포넌트이기 때문에 app router 를 이해하기 위해서는 server component 에 대한 이해가 필요합니다. server component 리액트는 클라이언트단만을 컴포넌트화하는 대신, server component라는 개념을 통해 서버 영역을 컴포넌트화합니다. ...

Jan 29, 20243 min read

Flutter, JavaScript

42 posts