📕 Book/모던C++입문

[모던C++입문] 2.6 멤버 변수에 접근하기

테디슨 2021. 7. 7. 23:33

2.6 멤버 변수에 접근하기

접근 함수

//게터와 세터를 도입하여 변수에 접근
complex c;
c.set_r(c.get_r() + 5); 

class complex
{
public:
    double& real() {return r;}
}

//레퍼런스를 반환하는 함수를 사용
c.real() += 5;

//자유함수 선언
inline double& real(complex& c) { return c.real(); }

첨자 연산자

class vector
{
public:
    double at(int i)
    {
        assert(i >= 0 && i < my_size);
        return data[i];
    }

    double operater[](int i)        //첨자 연산자
    {
        assert(i >= 0 && i < my_size);
        return data[i];
    }
}

double sum = sum2 = 0;
for( int i = 0; i < v.size(); ++i)
{
    sum += v.at(i);
    sum2 += v[i];
}
//sum과 sum2의 값은 동일

상수 멤버 함수

  • 상수 멤버 함수는 함수내의 불변성을 보증한다
class vector
{
public:
    double& operator[](int i) const     //함수 선언 뒤에 const
    {
        assert(i >= 0 && i < my_size);
        data[i] += 1;       //오류
        return data[i];
    }
}

레퍼런스로 한정된 멤버 (C++11)

class vector
{
public:
    double& operator[](int i) { return data[i]; }
    const double& operator[](int i) const { return data[i]; }

    vector operator+(const vector& v2) const {    return vector(size); }
private:
    double* data;
    int size;
};

int main()
{
    vector v{ 5 }, w{ 5 };

    (v + w)[3] = 7.3;   //말도 안되지만 컴파일 오류가 나지 않는다.
}

class vector
{
public:
    double& operator[](int i)& { return data[i]; }
    const double& operator[](int i) const& { return data[i]; }
    //중략
};

int main()
{
    vector v{ 5 }, w{ 5 };

    (v + w)[3] = 7.3;   //오류: 식이 수정할수 있는 lvalue여야 합니다.
}

class my_class
{
    double my_data() && {}   //&&으로 함수자체를 Rvalue로 제한
}
반응형