【问题标题】:The declaration of class in C++ combines the interface with the implementation of that interface?C++中类的声明将接口与该接口的实现结合起来?
【发布时间】:2012-12-31 00:00:51
【问题描述】:

我有一个关于类声明的问题。

我在一篇论文中读到以下几行: C++ 类声明将对象的外部接口与该接口的实现结合在一起。

那么,什么是 C++ 中的外部接口? C++中有接口的概念吗?如何理解这一点:C++ 类声明将对象的外部接口与该接口的实现结合在一起。 ?

【问题讨论】:

  • 纯虚拟类本质上只是一个接口——没有实现。所以这并不完全准确。
  • 我只是将其解释为实现派生自接口。

标签: c++ class interface


【解决方案1】:

我认为它指的是 API——即公共函数的签名——与实现相比——即私有函数和数据成员。

class T
{
   // Here are some private things.
   // You might say that these are part of
   //  the class's implementation.

   int x;
   int y;

   void foo();
   void bar();

public:
   // And here are some public things, that
   //  constitute the class's API or "interface",
   //  which is the mechanism by which you may
   //  interact with objects of this type.

   void baz();
   void boz();
};

注意它们是如何出现的,就在那里,在单一的类定义中,它们必须存在。 “组合”。

但最终,您必须询问论文的作者,因为使用的术语级别取决于他们。可以想象,他们可能在谈论继承层次结构和抽象基类......尽管我无法找到一种方法来合理化 C++ 类定义在任何真正意义上“组合”它们的断言。

【讨论】:

    【解决方案2】:

    我认为论文的定义有点不准确。 declarationimplementationdefinitioninterface 应严格使用这些术语。我会试着解释一下。

    首先,一个类声明没有指定任何接口:它只是声明这个类存在。例如,这些是一些声明:

    class my_class;
    struct my_structure;
    template<typename T> class X;
    

    一个类定义另一方面声明它们是一个类(函数和数据)的成员。在没有过多详细说明的情况下,您引用的论文所使用的术语 external interface 粗略地表示“可以通过属于以下函数的代码对该类的对象执行的操作的规范不是该类的成员”。

    这是一个类的例子定义

    class my_class
    {
    public:
        void foo();
        int bar(int x) const;
    private:
        void do_something();
        int data;
    };
    

    您提到的论文中使用的术语external interface几乎可以肯定是指public接口,它是具有public的类的所有成员的列表能见度。类的所有成员变量和函数都可以具有以下三种可见性级别之一:publicprotectedprivate。我在这里没有深入研究细节,但应该足以说public 成员(数据或函数)是可以从函数访问的那些成员,这些函数本身不是类的成员,而private 成员只能从类的 成员的函数中访问。 protected 限定符与继承有关,我认为不需要涵盖这一点来回答您的问题。

    现在上面的类my_class公共接口声明函数foo()和bar(),但还没有指定它们的实现 或者,更正式地说,它们的定义。通常,成员函数不一定在类定义中定义(您无法仅通过查看my_class 的定义来判断foo() 做了什么,对吗?)。因此,除非您在声明后直接编写成员函数的主体,否则需要单独的成员函数定义来指定其实现功能:

    void my_class::foo()
    {
        std::cout << "hello, i'm foo" << std::endl;
    }
    
    int my_class::bar(int x)
    {
        do_something();
        x * 2 + 1;
    }
    
    void my_class::do_something()
    {
        std::cout << "doing something..." << std::endl;
    }
    

    由于这些函数的可见性级别不同,来自类my_class外部函数的客户端代码可以调用函数foo()bar(),因为它们属于public接口,而不是函数@ 987654338@,声明为private。例如:

    int main()
    {
        my_class c;
        c.foo(); // OK!
        c.do_something(); // ERROR!
    }
    

    某些功能可以从类外部访问而其他功能不能访问这一事实背后的基本原理是在名为“信息隐藏”的良好设计原则中找到的.通过仅向您的客户公开一组服务并隐藏这些服务的实际实施方式实现(例如,函数bar()调用private函数do_something()),您创建了一个抽象层,以保护客户端代码免受这些服务实现中可能的内部更改的影响。

    所以最后,我相信“A C++ 类声明将对象的外部接口与该接口的实现相结合”这句话的作者实际上想说的是从类的定义中,您可以了解该类向其客户端公开的服务是什么(“外部接口”,即public 函数)是内部用来实现这些服务的函数和变量(“实现”,即private函数和成员变量)

    如果花了一点时间才最终给你解释那句话,我深表歉意,但我觉得有必要澄清一下。无论如何,这必然只是这个明确主题的简短摘要:我相信如果你在谷歌上搜索所有这些术语或者如果你购买一本关于 C++ 的好书,你可以找到更好的资源。

    P.S.:另外请记住,正式这个术语(和关键字!)interface 在 C++ 中的含义非常具体,需要引入 纯虚函数的概念。我认为这不是解释的情况,因为它可能与您引用的句子中“接口”一词的预期含义无关。

    【讨论】:

      【解决方案3】:

      您可以将类的公共成员视为外部接口。

      例如,在 C++ 中没有 interface,就像在 Java 中一样。只能定义一个基类,定义一些虚成员函数,必须由派生类实现。

      类声明包括publicprotected 和/或private 成员。 protected 和 private 成员可以被视为“实现”细节,但不一定是该公共接口的实现。

      【讨论】:

        【解决方案4】:

        接口包含方法的声明,可以在头文件中找到。此头文件与出现此方法代码的一些源文件相关联。例如,您可以看到如何在 Eclipse CDT 中添加一个类。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-13
          • 1970-01-01
          • 2020-12-03
          • 1970-01-01
          • 1970-01-01
          • 2019-03-11
          • 2017-11-23
          • 2019-01-05
          相关资源
          最近更新 更多