C++ 语法:A类:私有向量<T>{}含义

C++ Syntax : ClassA : private vector<T> {} meaning

本文关键字:gt 含义 lt 向量 语法 C++      更新时间:2023-10-16

我正在读取一个C++文件。C++中有一些我不明白的结构,但我不知道如何谷歌来学习这个。这是我正在阅读的一段代码:

template <typename value_type>
class iterstack: private vector<value_type> {
   private:
      using vector<value_type>::crbegin;
      using vector<value_type>::crend;
      using vector<value_type>::push_back;
      using vector<value_type>::pop_back;
      using vector<value_type>::back;
      typedef typename vector<value_type>::const_reverse_iterator
              const_iterator;
   public:
      using vector<value_type>::clear;
      using vector<value_type>::empty;
      using vector<value_type>::size;
      const_iterator begin() { return crbegin(); }
      const_iterator end() { return crend(); }
      void push (const value_type& value) { push_back (value); }
      void pop() { pop_back(); }
      const value_type& top() const { return back(); }
};

在上面的代码中,有一些我不明白的地方。

首先:

class iterstack: private vector<value_type>

上面一行与class iterstack: vector<value_type>有什么区别(没有private关键字(

其次:

using vector<value_type>::crbegin;

我真的不明白这句话。 using关键字,我经常在这种形式下使用:using namespace std另一种使用方式让我感到困惑。

请告诉我上面两点的含义。

谢谢:)

class iterstack: private vector<value_type> 中的private表示vector<value_type>是私有基类。 默认情况下,类的基类是私有的,因此在这种情况下,添加的私有关键字不起作用。如果基类是私有的,则其公共和受保护的接口将作为私有函数等添加到派生类中。

class Base {
    public:
    void fun(){}
};
class Derived1 : public Base { };  //fun() is public member function
class Derived2 : Base{}; //fun() is private
class Derived3 : private Base {}; //fun is private
class Derived4 : private Base {
    public:
    using Base::fun; //fun is public
}

有了using vector<value_type>::crbegin;,公共成员函数crbeginiterstack中是私有的(因为它来自用private关键字继承的基类(public

上面与class iterstack: vector<value_type>有什么区别(没有私钥(

没有区别。在使用 class 关键字(而不是 struct(定义的类中,继承默认是私有的;因此,无论您是否明确表示(如代码一样(或省略private关键字,都是私有的。

我真的不明白这句话。 using关键字

这是一个 using 声明,它使单个名称在当前范围内可用。它在此处用于使(私有(基类中的名称可用作此类的成员。

我经常以这种形式使用:using namespace std

这是一个 using 指令,它将命名空间的全部内容转储到当前范围内。如果您经常使用 using namespace std 将标准库转储到全局命名空间中,那么这是一个您应该改掉的坏习惯;它用许多不需要的名称污染命名空间,这些名称可能与您的程序要使用的名称冲突。命名空间的存在是有充分理由的 - 使用它们。

你只是从vector继承了private ly。其中基类是vector,派生类是iterstack

接下来你要做的是在iterstack中公开crbegin

你的第一个问题是关于私有继承的。使用 private 关键字继承,如在 class iterstack: private vector<value_type> 中,本质上使类继承自 vector<value_type> 只有iterstack知道的事实。也就是说,它继承自vector<value_type>,并且可以在内部使用vector<value_type>的所有功能,但程序的其余部分不知道它继承自vector<value_type>,因此不能像在class iterstack: public vector<value_type>中那样将其视为vector<value_type>类型的对象。您可以在此处找到有关私有继承的更多信息:私有、公共和受保护继承之间的区别

您的第二个问题是关于using关键字在using vector<value_type>::crbegin;中的用法。在此上下文中,单词using具有使crbeginvector<value_type>成为类的公共成员的效果。它本质上是做与using namespace std;相同的事情,除了不是将std命名空间中的所有名称引入函数的命名空间,而是将特定名称crbeginvector<value_type>引入到类的命名空间中,这具有使其成为类的公共成员的效果。您可以在此处找到有关using声明的许多用途的更多信息:http://en.cppreference.com/w/cpp/language/using_declaration

private 关键字将超类

向量声明为 private,因此您无法更改超类。