请解释一下如何实现

时间:2015-02-24 01:10:32

标签: c++

我所看到和被教授的有关封装的内容是,我们可以将数据成员设为私有,成员函数是公开的。

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

  

从接口分离实现;封装隐藏   一个类型的实现细节。在C ++中,通过将实现放在类的私有部分来强制执行封装。

最后一行是令人困惑的部分:将实现放在类的私有部分。通过实现,他意味着函数定义,对吗?我的意思是,我从来没有见过宣布公开(作为原型)并私下实施的功能。

我真的很困惑。请用一个简单的例子来解释他想说的话。

2 个答案:

答案 0 :(得分:2)

正在解释的概念比你想到的更抽象。 “接口”是“呼叫者期望对象做什么”。从技术上讲,实施是如何实际执行这些操作的。

例如,参加List课程。 使用 List的代码应仅关注其界面:addObject()clear()getSize()sort()。< / p>

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

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

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;
    }
};

最后要解决你所说的话:

  

我的意思是,我从未见过一个声明为公共(作为原型)并在私下实现的函数。

“私人”再次比你想的更抽象。类的实现基本上总是“私有”,因为它对调用者是隐藏的。它不一定意味着private:访问说明符。它只是意味着它不会暴露给呼叫者。公共方法的实施符合这种描述。

答案 1 :(得分:1)

你确实可以在一个类中拥有私有函数(方法)。考虑:

class X 
{
public:
  // public interface - this never changes and you provide documentation for it
  void do_something();

private:
  // this private interface is likely to change. consumers of this class
  // are prevented from calling these methods unless they are friends
  void first_private_thing();
  void second_private_thing();

};

// definition
void X::do_something()
{
  // private implementation in public method
  first_private_thing();
  second_private_thing();
}

此主题还有其他扩展,例如:

class Base
{
public:
  // public non-virtual interface
  void do_something();

private:
  // calls private virtual implementation
  virtual void do_something_impl() = 0;

};

// definition:
void Base::do_something()
{
  do_something_impl();
}