C ++, нужна помощь, чтобы понять некоторые конструкторы и функции в векторном классе, используя указатели
-
27-10-2019 - |
Вопрос
Приветствую все;
Я должен разработать библиотеку класса 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 на эту тему.
Итерация над массивом, добавляя каждый элемент в вектор. Я предполагаю, что n является количеством элементов в массиве?
Разница между конструктором копирования и назначением, вероятно, является семантическим. Они будут оказывать одинаковое влияние на внутреннюю структуру вектора, но могут использоваться в разных ситуациях.
Это просто предположение, но я думаю, что изменчивость - это разница. Вторая функция возвращает неизменную T, что означает, что ее нельзя изменить. Первая функция возвращает изменяемый (изменчивый) T.