TIL/TIS 211125

gyeon·2021년 11월 25일
0

TIL/TIS

목록 보기
10/14

멤버 초기화 리스트(Member initializer list)

(= 생성자 초기화 리스트, 초기화 리스트...)
C++에서 생성자 이외에 클래스의 멤버들을 초기화 할 수 있는 방법 중 하나이다.
형태 및 사용방식

#include <iostream>

class TestClass {
    private:
        const int var1;
        bool var2;
    public:
        TestClass(int var1, bool var2);
};

TestClass::TestClass(int var1, bool var2) : var1(var1), var2(var2) {}

일반 생성자와의 차이점
멤버 초기화 리스트를 사용하면 맴버변수 할당과 초기화를 동시에 한다.

int var1 = src;

일반적인 생성자를 사용하면, 맴버 변수들이 할당되고 그 이후 생성자를 통해 값이 대입된다.

int var1;
...
this.var1 = src;

위의 경우는 문제가 없지만, 만약 var1이 const이거나 객체인경우 문제가 발생한다.
const가 있는 경우 멤버초기화 리스트와 생성자의 차이.

class TestClass {
    private:
        const int var1;
        bool var2;
    public:
        TestClass(int var1, bool var2);
        int getVar1() {return var1;};
        bool getVar2() {return var2;};
};

TestClass::TestClass(int var1, bool var2) : var1(var1), var2(var2) {}

// 에러 발생!!!
TestClass::TestClass(int var1, bool var2) {
    this->var1 = var1;
    this->var2 = var2;
}
/* "TestClass::TestClass(int var1, bool var2)"이(가) 다음에 대한 이니셜라이저를 제공하지 않습니다. -- 상수 멤버 "TestClass::var1"
** 식이 수정할 수 있는 lvalue여야 합니다.
** 위와 같은 에러들이 발생한다.
/*

멤버변수가 객체인경우, 멤버초기화 리스트를 사용하면 다음과 같다.

TestClass tc(src);

멤버변수가 객체인경우, 생성자를 사용하면 다음과 같다?

TestClass tc(); // 디폴트 생성자 호출
...
tc = src;

static in class

C++에서도 클래스 내부의 static은 클래스 자체에서 접근이 가능하고, 모든 인스턴스가 공유한다.
다만 당연히 외부에서 접근시에는 클래스를 이용해서 접근하는게 좋다.

const함수와 mutable

const함수는 class내부에서 사용하며, 맴버 변수를 수정하지 않는 함수이다.
하지만 mutable키워드가 있는 맴버 변수는 const함수 내부에서도 수정 가능하다.

#include <iostream>

class TestClass {
    int var1;
    mutable int var2;
    public :
        TestClass(int var1, int var2);
        int getVar1() const;
};

TestClass::TestClass(int var1, int var2) {
    this->var1 = var1;
    this->var2 = var2;
}

int TestClass::getVar1() const {
    // 에러 발생!
    // this->var1 = 42;
    // 식이 수정할 수 있는 lvalue여야 합니다.C/C++(137)
    
    // var2은 mutable이므로, 수정 가능
    this->var2 = 42;
    return this->var1;
}

활용1
활용2 -> 그래서 mutable 이 왜 필요한데? 항목

profile
백엔드와 서버 in 42Seoul

0개의 댓글