在A Tour of C++第三版的Chapter 5.2中,Bjarne 写了关于具体类型的内容。我不明白什么是灵活性。
该表示可以是私有的并且只能通过 成员函数(如 Vector;第 2.3 节),但它是存在的。 因此,如果代表性发生任何重大变化, 用户必须重新编译。这是拥有混凝土所付出的代价 类型的行为与内置类型完全相同。对于不改变的类型 通常,局部变量提供了急需的清晰度和 效率,这是可以接受的并且通常是理想的。 增加 灵活性,具体类型可以保留其主要部分 自由存储(动态内存、堆) 上的表示和访问 它们通过存储在类对象本身中的部分来实现。这就是 矢量和字符串的实现方式;他们可以被考虑 具有精心设计的接口的资源句柄。
我认为这两个问题的答案都是肯定的。
任何依赖于类实现设计的复杂数据都应该存储在堆上。所以
std::vector
可以实现为
template <type T>
class vector {
private:
vector_implementation<T>* data;
...
}
然后
vector
的所有方法只需调用vector_implementation
中对应的方法即可,例如
void vector<T>::push_back(T val) {
data->push_back(val);
}
如果需要更改实现,则更改
vector_implementation
,但使用 std::vector
的代码不需要重新编译,因为该结构不需要任何更改。