C ++, нужна помощь, чтобы понять некоторые конструкторы и функции в векторном классе, используя указатели - PullRequest
0 голосов
/ 29 апреля 2011

Greetings All;

Мне нужно разработать библиотеку классов C ++, содержащую набор численных методов для научных вычислений.В библиотеке должен быть реализован класс Vector (с использованием указателей) с некоторыми базовыми функциями, указанными в заголовочном файле "Vector.h".

#ifndef VECTOR_H
#define VECTOR_H

template <class T>
class CVector {
private:
    int nn; //size of array
    T *v;   //pointer to array of data

public:

    //Default constractor
   CVector();

    //zero based array
    CVector(int n);

    //initialize to constant of value a
    CVector(int n, const T &a);

    //initialize to array a
    CVector(int n, const T *a);

    //copy constractor
    CVector(const CVector &rhs);

    //assignment
    CVector & operator=(const CVector &rhs);

    //i'th element
    inline T & operator[](const int i);

    inline const T & operator[](const int i) const;

    inline int size() const;

    //resize (contents not preserved)
    void resize(int newn);

    //resize and assign a constant value
    void assign(int newn, const T &a);

    //deconstractor
    ~CVector();

};

#endif  /* VECTOR_H */

Я новичок в C ++, и у меня возникли некоторые затруднения с пониманием некоторых конструкторов ифункции в приведенном выше коде.

Мои вопросы:

1- Какова концепция следующего конструктора?

    //initialize to array a
    CVector(int n, const T *a);

Я имею в виду, как инициализировать вектор длямассив a?

2- Чем отличается конструктор копирования от конструктора присваивания?

    //copy constractor
    CVector(const CVector &rhs);

    //assignment
    CVector & operator=(const CVector &rhs);

3- Я знаю, что эта функция возвращает i-й элемент вектора:

    //i'th element
    inline T & operator[](const int i);

но в чем разница между ним и этим:

    inline const T & operator[](const int i) const;

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

С уважением;

Ответы [ 3 ]

1 голос
/ 29 апреля 2011

1) установите для своих членов: v = new T[n]; nn = n; и скопируйте элементы: for (int i = 0; i != n; ++i) v[i] = a[i];

2) Назначение копирования - это когда у вас уже есть объект, и вы хотите присвоить ему другое значение.Конструктор копирования - это когда вы хотите создать новый объект со значениями из существующего.

3) В c ++ существует понятие const функций: если вы вызываете функцию для объекта const;скажем: CVector<int> const& x = ...; x[3] = 3; не будет работать, так как x является постоянным.Но чтобы это не сработало, operator[] необходимо вернуть const & вашим внутренним органам.
К вашему сведению: если x неконстантный, тип x[3] равен T &, посколькуконстантная версия operator [] используется.Однако, если x является константой, тип x[3] равен const T &, поскольку используется константная версия operator [].

1 голос
/ 29 апреля 2011

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

Например:

   float a[42] = { 31, 41, 59 };
   CVector<float> v( 3, a );

Q2: первыйявляется конструктором копирования, второй является оператором присваивания.Конструктор копирования используется для копирования значений в параметр функции, для возврата значения из функции или для инициализации переменной.

Например, для этих целей используется конструктор копирования:

CVector<float> foo( CVector<float> v ) { ... }

...
CVector<float> v1;
CVector<float> v2 = foo( v1 ); // Copy constructor used to pass in v1, and to return v2
CVector<float> v3 = v1; // Copy constructor used to copy v1 to v2.

И для этого используется присвоение:

CVector<float> v4;
v4 = v1;

Q3.Первый может быть использован в левой части задания.Константная версия используется применительно к константному объекту.

void bar( const float & fval ) { ... }
...
CVector<float> v1( 3, a );
v1[0] = 42;   // Non-const operator[]

const CVector<float> v2 = v1; 
float value = v2[0];  // Const operator[]
bar( v2[0] ); // Const operator[]
0 голосов
/ 29 апреля 2011

Хорошо, я не гуру C ++, так что, надеюсь, кто-то более компетентный включится ... но вот мои $ .02 по этому вопросу.

  1. Итерациипо массиву, добавляя каждый элемент в вектор.Я предполагаю, что n - это количество элементов в массиве?

  2. Разница между конструктором копирования и присваиванием 1, вероятно, семантическая.Они будут иметь одинаковое влияние на внутреннюю структуру вектора, но могут использоваться в разных ситуациях.

  3. Это всего лишь предположение, но я думаю, что изменчивость - это разница.Вторая функция возвращает неизменный T, что означает, что его нельзя изменить.Первая функция возвращает изменчивый (изменяемый) T.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...