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

    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로 제한
    }
    
    반응형

    댓글

    Designed by JB FACTORY