Доступ к членам класса аргумента в функции-члене - PullRequest
1 голос
/ 30 мая 2019

Я пишу некоторый код как часть небольшого проекта, над которым я работаю, и что-то выделялось мне, когда я тестировал свой код. Я работаю с функцией класса, показанной ниже:

class Matrix{
    public:
        //Constructors
        Matrix();                   //EMPTY Matrix
        Matrix(int, int);           //Matrix WITH ROW AND COL
        Matrix(const Matrix &);     //Copy a matrix to this one
        ~Matrix();                  //Destructor

        //Matrix operations involving the matrix in question
        Matrix madd(Matrix const &m) const; // Matrix addition

    private:
        double **array; //vector<vector<double>> array;
        int nrows;
        int ncols;
        int ncell;
};

Ниже, обращая внимание на функцию madd, я выписал ее в другом файле, показанном ниже:

Matrix Matrix::madd(Matrix const &m) const{
    assert(nrows==m.nrows && ncols==m.ncols);

    Matrix result(nrows,ncols);
    int i,j;

    for (i=0 ; i<nrows ; i++)
        for (j=0 ; j<ncols ; j++)
            result.array[i][j] = array[i][j] + m.array[i][j];

    return result;
}

Полагаю, вы можете догадаться, что он добавляет матрицу. Если честно, я нашел какой-то код в сети, и я просто пытаюсь изменить его для своего собственного использования, так что эта функция была написана не мной полностью. Мне удалось это скомпилировать, и после небольшого теста все заработало правильно, но меня смущает то, как в функции я смог вызвать m.ncols и m.nrows. Глядя на определение класса, члены являются частными, так как я могу получить к ним доступ? Даже если аргумент m передается как const, так как параметры nrows и ncols защищены, могу ли я NOT иметь доступ к ним (из аргумента)? Я не понимаю, почему это разрешено.

1 Ответ

3 голосов
/ 30 мая 2019

С Спецификаторы доступа на cppreference.com

Доступ к закрытому члену класса могут получить только члены и друзья этого класса, независимо от того, принадлежат ли члены к одному и тому же экземпляру:

class S {
private:
    int n; // S::n is private
public:
    S() : n(10) {} // this->n is accessible in S::S
    S(const S& other) : n(other.n) {} // other.n is accessible in S::S
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...