C++ 语法:A类:私有向量<T>{}含义
C++ Syntax : ClassA : private vector<T> {} meaning
我正在读取一个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;
,公共成员函数crbegin
在iterstack
中是私有的(因为它来自用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
具有使crbegin
从vector<value_type>
成为类的公共成员的效果。它本质上是做与using namespace std;
相同的事情,除了不是将std
命名空间中的所有名称引入函数的命名空间,而是将特定名称crbegin
从vector<value_type>
引入到类的命名空间中,这具有使其成为类的公共成员的效果。您可以在此处找到有关using
声明的许多用途的更多信息:http://en.cppreference.com/w/cpp/language/using_declaration
向量声明为 private,因此您无法更改超类。
- EASTL矢量<向量<int>>连续的
- 冒号的含义
- 隐式调用的含义是什么?
- C++:考虑C++ std::string 中双引号 (") 的字面含义,而不使用反斜杠 (\)
- 数据类型"struct seq<0, 1, 2>{}"含义是什么?
- 在将函数声明为友元时,尖括号的含义是什么?
- "static char __ = []() -> char"的含义
- "Class1::Class2"在C++中的含义是什么?
- C/C++ 中 0b00 和 0b11 的含义是什么?
- 这些指针的含义,指针到指针,函数指针和数组指针
- C++版本,它们的含义,如何更新它们
- "reserved for any use"的含义是什么?
- "res"在C++中的含义是什么?
- "type* = nullptr"的含义是什么
- "类型名称"在 asio 分配示例中的含义
- 错误含义;以二进制形式打印数字
- 无法理解新 int(2) 的含义
- C++ 中 uint8_t* 值的含义和调试(打印)
- 当关系运算符的含义相同时,为什么结果不同?
- 这行代码在C++中的含义是什么?