C++中类的声明将接口与该接口的实现结合在一起

The declaration of class in C++ combines the interface with the implementation of that interface?

本文关键字:接口 在一起 实现 结合 声明 C++      更新时间:2023-10-16

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

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

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

我认为它指的是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++类定义在任何真正意义上"结合"这些定义的断言。

我认为论文的定义有点不准确。术语声明实现定义接口应严格使用。我试着解释一下。

首先,类声明不指定任何接口:它只是声明类存在。例如,以下是一些声明:

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

另一方面,类定义声明,它们是类(函数和数据(的成员。在不涉及太多细节的情况下,您引用的论文所使用的术语外部接口大致意思是"通过属于该类而非成员的函数的代码对该类对象可以做什么的规范"。

以下是类定义的示例:

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

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

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

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接口,但不属于声明为private的函数do_something()。例如:

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

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

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

如果花了很长时间才最终给你解释这句话,我很抱歉,但我觉得应该澄清一下。无论如何,这一定只是对这个明确主题的简短总结:我相信,如果你在谷歌上搜索所有这些术语,或者如果你买了一本关于C++的好书,你可以找到更好的来源。

附言:还请记住,形式上术语(和关键字!(interface在C++中意味着非常具体的东西,这需要引入纯虚拟函数的概念。我认为这不是解释的情况,因为这可能与你引用的句子中"界面"一词的本意无关。

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

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

类声明包括publicprotected和/或private成员。受保护的成员和私有成员可以被视为"实现"细节,但不一定是公共接口的实现。

接口包含方法的声明,这可以在头文件中找到。此头文件与一些源文件相关,其中显示了此方法的代码。例如,您可以看到如何在EclipseCDT中添加一个类。