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);
ベクトルをアレイ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:このコンストラクターを使用して、aから始まる配列のn要素の内容をベクトルに満たすことができます。
例えば:
float a[42] = { 31, 41, 59 };
CVector<float> v( 3, a );
Q2:1つ目はコピーコンストラクター、2つ目は割り当て演算子です。コピーコンストラクターは、値を関数パラメーターにコピーしたり、関数から値を返したり、変数を初期化したりするために使用されます。
たとえば、コピーコンストラクターはこれらに使用されます。
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。 1つ目は、割り当ての左側で使用できます。 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)コピー割り当てとは、すでにオブジェクトを持っていて、それに異なる値を割り当てたい場合です。コピーコンストラクタは、既存のオブジェクトから値を持つ新しいオブジェクトを作成する場合です。
3)C ++には、const関数の概念があります。constオブジェクトの関数を呼び出す場合。いう: CVector<int> const& x = ...; x[3] = 3;
それ以来、動作しません x
constです。しかし、これが機能しないために、 operator[]
返す必要があります const &
あなたの内部に。
参考:if x
コンスト、タイプのタイプです x[3]
は T &
非コンストバージョンのためです operator []
使用されている。もしも x
ただし、const、タイプです x[3]
は const T &
constバージョンの operator []
使用されている。
わかりました、私はC ++の第一人者ではないので、もう少し有能な人がチャイムをかけることを願っています...しかし、ここに私の$ .02があります。
配列を反復し、各要素をベクトルに追加します。私は、nが配列内の要素の数であると仮定していますか?
コピーコンストラクターと1つの割り当ての違いは、おそらくセマンティックです。それらはベクトルの内部構造に同じ効果をもたらしますが、さまざまな状況で使用できます。
これは単なる推測ですが、私は可変性が違いだと思っています。 2番目の関数は不変のTを返します。つまり、変更できません。最初の関数は、可変(変更可能)Tを返します。