0

みなさん、こんにちは。

科学計算のための数値手法のコレクションを含むC++クラスライブラリを開発する必要があります。ライブラリは、ヘッダーファイル「Vector.h」に記述されているいくつかの基本的な機能を備えたVectorクラス(ポインタを使用)を実装する必要があります。

#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-この関数がベクトルのi番目の要素を返すことであることを私は知っています:

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

しかし、それとこれの違いは何ですか:

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

それらを.cppファイルに実装する方法と、メインでそれらを呼び出す方法を知るために、概念を理解する必要があります。助けていただければ幸いです。

よろしくお願いします;

4

3 に答える 3

1

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。最初のものは、割り当ての左側で使用できます。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[]
于 2011-04-29T14:19:45.547 に答える
1

1)メンバーを次のように設定しv = new T[n]; nn = n; 、要素をコピーします。for (int i = 0; i != n; ++i) v[i] = a[i];

2)コピー割り当てとは、すでにオブジェクトがあり、それに別の値を割り当てたい場合です。コピーコンストラクタは、既存のオブジェクトの値を使用して新しいオブジェクトを作成する場合に使用します。

3)c ++には、const関数の概念があります。constオブジェクトで関数を呼び出す場合。言う:constなのでCVector<int> const& x = ...; x[3] = 3;、動作しません。xしかし、これが機能しないためには、あなたの内部operator[]に戻る必要があります。 参考:がnon-constの場合、のタイプはnon -constバージョンが使用されているためです。ただし、がconstの場合、のタイプはconstバージョンが使用されるためです。const &
xx[3]T &operator []xx[3]const T &operator []

于 2011-04-29T14:32:25.643 に答える
0

わかりました。私はC++の第一人者ではないので、もう少し有能な人がチャイムを鳴らしてくれることを願っています...しかし、これが私の$.02です。

  1. 配列を反復処理し、各要素をベクトルに追加します。nは配列内の要素の数だと思いますか?

  2. コピーコンストラクタと代入コンストラクタの違いは、おそらくセマンティックです。これらはベクトルの内部構造に同じ影響を及ぼしますが、さまざまな状況で使用できます。

  3. これは単なる推測ですが、可変性が違いだと思います。2番目の関数は不変のTを返します。これは、変更できないことを意味します。最初の関数は、変更可能な(変更可能な)Tを返します。

于 2011-04-29T14:22:11.183 に答える