C ++, нужна помощь, чтобы понять некоторые конструкторы и функции в векторном классе, используя указатели

StackOverflow https://stackoverflow.com/questions/5833226

Вопрос

Приветствую все;

Я должен разработать библиотеку класса C ++, включающую коллекцию численных методов для научных вычислений. Библиотека должна реализовать векторный класс (с использованием указателей) с некоторыми основными функциональными возможностями, указанными в файле заголовка "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);

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

2- В чем разница между конструктором копирования и назначением?

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

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

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

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

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

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

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

С наилучшими пожеланиями;

Это было полезно?

Решение

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

Например:

   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 Первый можно использовать на левой стороне задания. Версия Const используется при применении к объекту Const.

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[]

Другие советы

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

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

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 [] используется.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top