关于C ++中的数组模板的问题

时间:2014-02-18 00:44:54

标签: c++ arrays templates const

我参加了一个课程,我们将介绍一些软件模式,其中一个是迭代器模式,我们被要求用C ++实现它。我们的教授几周前给了我们一些示例代码,我想比它更好地理解它。首先我发布代码:

template <class T_,std::size_t SIZE_>
class carray {
public:
typedef T_              value_type;
typedef std::size_t     size_type;
typedef T_ &            reference;
typedef T_ const &      const_reference;
typedef T_ *            pointer;
typedef T_ const *      const_pointer;
typedef T_ *            iterator;
typedef T_ const *      const_iterator;
typedef std::ptrdiff_t  difference_type;

typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;

// data store
value_type data[SIZE_];

size_type   size() const { return SIZE_; }
reference operator [] ( size_type idx ) { return data[idx]; }
const_reference operator [] ( size_type idx ) const { return data[idx]; }

reverse_iterator    rbegin() { return reverse_iterator( end() ); }
reverse_iterator    rend() { return reverse_iterator( begin() ); }
const_reverse_iterator  rbegin() const { return const_reverse_iterator( end() ); }
const_reverse_iterator  rend() const { return const_reverse_iterator( begin() ); }
const_reverse_iterator  crbegin() const { return const_reverse_iterator( end() ); }
const_reverse_iterator  crend() const { return const_reverse_iterator( begin() ); }

iterator    begin() { return data; }
iterator    end() { return data + SIZE_; }
const_iterator  begin() const { return data; }
const_iterator  end() const { return data + SIZE_; }
const_iterator  cbegin() const { return data; }
const_iterator  cend() const { return data + SIZE_; }

};

在这个模板中,我们的教授定义了一堆typedef,其中一些同时具有非常量和常量版本。首先,我想知道每个公共成员的目的是什么,其次,我想知道在定义数据结构模板的情况下,常量版本的目的是什么。

我还注意到一些成员函数被定义为&#39; const&#39;我想知道这是什么目的。

3 个答案:

答案 0 :(得分:1)

  

我想知道每个公众成员的目的是什么。

该类包含以下内容:

  • 类型别名:键入从类中公开以供公众使用的信息。

    • 非const typedef是非const T的类型别名。
    • const typedef是const T的类型别名。

    这些typedef很有用,因为该类的用户可能需要有关该类型的更多信息。通过使用类暴露的typedef,他可以获得这个。这是一个很好的例子 - 考虑我们有模板类型的情况,我们需要访问底层迭代器类型。通过使用公开类型别名,我们可以访问它:

    template<class Container>
    void example(Container& c)
    {
        typename Container::iterator begin = c.begin(),
        //       ^^^^^^^^^^^^^^^^^^^
                                     end   = c.end();
    }
    
      

    我想知道常量版本的用途是什么。

    有时用户需要使用const类型。因此,使用类提供的类型信息可以使这一点变得简单。

  

我还注意到一些成员函数被定义为'const',我想知道它的目的是什么。

const成员函数是不修改任何类数据成员的函数。

答案 1 :(得分:1)

  1. 所有typedef旨在促进这些类型的使用, std::size_t std::ptrdiff_t只是unsigned int typedef。 forch here for reverse_iterator

  2. const constialbe为const版本函数的返回值定义,为const obj提供,检查here

  3. 定义为const的成员函数确保在函数体中未更改成员变量,请检查here

答案 2 :(得分:1)

  1. 为此,我认为你应该尝试使用这个模板,你可能真的知道为什么需要这样的公众成员。

  2. 当我们使用这个模板来操作某些数据结构时,如果我们想修改一些数据,我们需要一个非常量版本。另一方面,如果我们想要更改数据的价值,我们需要一个可以帮助我们保护数据的常量版本。

  3. 当您尝试操作某些数据并且您不想修改成员数据时,常量函数可以帮助您。