我认为论文的定义有点不准确。 declaration、implementation、definition 和 interface 应严格使用这些术语。我会试着解释一下。
首先,一个类声明没有指定任何接口:它只是声明这个类存在。例如,这些是一些声明:
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的类的所有成员的列表能见度。类的所有成员变量和函数都可以具有以下三种可见性级别之一:public、protected 或 private。我在这里没有深入研究细节,但应该足以说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++ 中的含义非常具体,需要引入 纯虚函数的概念。我认为这不是解释的情况,因为它可能与您引用的句子中“接口”一词的预期含义无关。