需要帮助理解使用指针的vector类中的一些构造函数和函数

C++,Need help to understand some constructors and functions in a vector class using pointers

本文关键字:构造函数 函数 vector 助理 帮助 指针      更新时间:2023-10-16

大家好;

我必须开发一个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文件中实现它们,以及如何在我的主程序中调用它们。如果你能帮助我,我会很高兴的。

问好;

Q1:这个构造函数可以用来用数组中从a开始的n个元素的内容填充vector。

例如:

   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;

第三季。第一种可用于赋值操作的左侧。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是常量。但这不起作用,operator[]需要返回一个const &到你的内部。仅供参考:如果x是非const,则x[3]的类型为T &,因为使用的是operator []的非const版本。如果x为const,则x[3]的类型为const T &,因为使用的是operator []的const版本。

好吧,我不是c++专家,所以希望有更有能力的人能加入进来…这是我的钱。在这个问题上。

  1. 遍历数组,将每个元素添加到vector中。我假设n是数组中元素的个数?

  2. 复制构造函数和赋值构造函数之间的区别可能是语义上的。它们将对矢量的内部结构产生相同的效果,但可以在不同的情况下使用。

  3. 这只是一个猜测,但我认为可变性是不同的。第二个函数返回一个不可变的T,这意味着它不能被改变。第一个函数返回一个可变的t。