ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++ 14] 클래스 / 추가된 기능과 기억해야 할 내용
    프로그래밍 기초/C++ 2022. 5. 22. 11:32

      클래스 

    생성자

    = 단일 인수를 가지는 생성자는 대입 연산자로 생성해도 오버헤드가 발생하지 않는다.


    class complex {

    public:

        complex(double r = 0, double i = 0) : r(r), i(i) {}    // ...
    }

    complex z4 = 4; // 과거에는 임시 변수를 생성해 오버헤드가 발생한다고 했으나 최신 컴파일러는 문제없이 최적화한다.


     

    = 생성자가 여러 개 일 때 다른 생성자를 불러 초기화하는 것을 허용한다.


    class complex

    {
    public:

        complex(double r, double i) : r{r}, i{i} {}

        complex(double r) : complex{r, 0.0} {}

        complex() : complex{0.0, 0.0} {}

        // ...

    }


     

    = 멤버의 기본 값을 지정할 수 있다. 이 경우 생성자에서 초기화해주지 않아도 된다.


    class complex

    {

    public:

        complex(double r, double i) : r{r}, i{i} {}

        complex(double r) : r{r} {}

        complex() {}

        // ...

    private:

        double r = 0.0, i = 0.0;

    }


     

    초기화 리스트

    = 클래스 생성 시 여러 값을 초기 값으로 지정할 수 있다.


    class vector

    {

        vector(std::initializer_list<double> values)

            : my_size(values.size()), data(new double[my_size])

        {

            std::copy(std::begin(values), std::end(values), std::begin(data));

        }

    }

    vector v = {1.0, 2.0, 3.0};


     

    유니폼 초기화

    = 일관된 방식으로 초기화를 지원한다.


    complex c{7.0, 8}, c2 = {0, 1}, c3 = {9.3}, c4 = {c};

    // 초기화 리스트를 사용하는 경우 원칙적으로 중괄호를 두 번 써야 하지만 생략을 지원한다.

    vector v1 = {{1.0, 2.0, 3.0}}; // 이것은

    vector v2 = {1.0, 2.0, 3.0}; // 이것과 같다.


     

    이동 문법

    이동 생성자

    = 이동 키워드(&&)를 사용하여 이동 생성자를 구현하여 데이터를 복사하지 않고 이동시킬 수 있다.


    class vector

    {

        vector(vector&& v)

            : my_size(v.my_size), data(v.data)

        {

            v.data = 0;

            v.my_size = 0; // 데이터를 복사한 뒤 원본의 데이터를 제거하여 이동을 구현한다.

        }

    }


     

    이동 할당 연산자

    = 대입 연산자에 이동을 적용하여 복사 후 원본을 비우는 형태로 만들 수 있다.


    vector& operator=(vector&& src)

    {

        assert(my_size == 0 || my_size == src.my_size);

        std::swap(data, src.data);

        return *this;

    }


     

    댓글

Designed by Tistory.