gpt4 book ai didi

c++ - 请解释这是如何实现的

转载 作者:太空狗 更新时间:2023-10-29 21:19:00 25 4
gpt4 key购买 nike

关于封装,我所看到和学到的是,我们可以将数据成员作为私有(private)的,而成员函数是公共(public)的。

但 C++ Primer 将封装定义为:

Separation of implementation from interface; encapsulation hides the implementation details of a type. In C++, encapsulation is enforced by putting the implementation in the private part of a class.

最后一行是令人困惑的部分:将实现放在类的私有(private)部分。通过实现,他的意思是函数定义,对吧?我的意思是,我从未见过声明为公共(public)(作为原型(prototype))并以私有(private)方式实现的函数。

我真的很困惑。请用一个简单的例子来解释他想表达的意思。

最佳答案

正在解释的概念比您想象的更抽象。 “接口(interface)”是“调用者期望对象做什么”。从技术上讲,实现是类实际执行这些操作的方式。

例如,采用List 类。 使用 List 的代码应该只关心它的接口(interface):像 addObject(), clear(), getSize()sort()

但是 List实现——调用者不应该关心——可能在如何实现这一点上有很大的不同。例如,数据可以存储为链表。或者可能作为一个动态数组。这是只有 List 类需要关心的“私有(private)”实现细节。确实可能会有一个名为 reallocate()private: 方法。来电者不应该使用这个;它是一个实现细节——不是公共(public)接口(interface)的一部分。调用者不应该关心 List 如何分配它的存储空间。

类似地,sort() 方法意味着它将对列表中的对象进行排序。这就是界面。但是实现可以使用任意数量的算法来执行排序。实现是私有(private)细节 - 可以在私有(private)方法中完成。在任何情况下,它都是对调用者隐藏的。

template<typename T>
class List
{
public:
// public members are part of the interface: the externally-visible behavior "contract" your object guarantees.
void addObject(const T& obj)
{
// call private methods to help carry out implementation.
ensureCapacity(this->sizeAllocated + 1);
this->sizeAdvertized += 1;
// ... and copy the object into the right position in this->data...
}

size_t getSize() const
{
return this->sizeAdvertized;
}

// ... other members like clear(), sort()...

private:
T* data;
size_t sizeAllocated;
size_t sizeAdvertized;

// this needs to be private because it's not part of the interface. Callers
// should never need to call this.
void ensureCapacity(size_t requestedCapacity)
{
if(sizeAllocated >= requestedCapacity)
return;// already have enough storage available.

// ... reallocate this->data, copy existing items to the new array...

this->sizeAllocated = requestedCapacity;
}
};

最后要解决你所说的问题:

I mean, I've never seen a function declared public (as prototype) and implemented in private.

“私有(private)”再次比您想象的更抽象。类的实现基本上始终是“私有(private)的”,因为它对调用者是隐藏的。它不一定表示 private: 访问说明符。这只是意味着它不会暴露给调用者。公共(public)方法的实现符合此描述。

关于c++ - 请解释这是如何实现的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28686625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com