我有一个关于类声明的问题。
我在一篇论文中读到了以下几行: 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
可见性的类的所有成员的列表。类的所有成员变量和函数都可以具有以下三种可见性级别之一:public
、protected
或private
。我在这里没有深入研究细节,但应该足以说public
成员(数据或函数)是那些可以从本身不是类成员的函数访问的成员,而private
成员只能从属于类的函数访问班的成员。这protected
限定符与继承有关,我认为不需要涵盖它来回答您的问题。
现在上面类的公共接口声明了函数 foo() 和 bar(),但还没有指定它们的实现,或者更正式的术语,它们的定义。通常,成员函数不一定在类定义中定义(您无法仅通过查看 的定义来判断它的作用,对吗?)。因此,除非您在声明后直接编写成员函数的主体,否则需要单独的成员函数定义来指定该函数的实现:my_class
foo()
my_class
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
接口,但不do_something()
属于声明为的函数private
。例如:
int main()
{
my_class c;
c.foo(); // OK!
c.do_something(); // ERROR!
}
某些功能可以从类外部访问而其他功能不能访问这一事实背后的基本原理是在名为“信息隐藏”的良好设计原则中找到的。通过仅向您的客户公开一组服务并隐藏这些服务的实际实现方式(例如,函数bar()
调用private
函数do_something()
),您创建了一个抽象层,以保护客户端代码免受这些服务实现中可能的内部更改的影响。
所以最后,我相信“ A C++ 类声明将对象的外部接口与该接口的实现相结合”这句话的作者实际上想说的是,从类的定义中你可以得到关于什么的提示是类向其客户端公开的服务(“外部接口”,即public
函数),以及在内部用于实现这些服务的函数和变量是什么(“实现”,即private
函数和成员变量)。
如果花了一点时间才最终给你解释那句话,我深表歉意,但我觉得有必要进行一些澄清。无论如何,这必然只是这个明确主题的简短摘要:我相信如果你在谷歌上搜索所有这些术语或者如果你购买一本关于 C++ 的好书,你可以找到更好的资源。
PS:另外请记住,正式的术语(和关键字!)interface
在 C++ 中意味着非常具体的东西,这需要引入纯虚函数的概念。我认为这不是解释的情况,因为它可能与您引用的句子中“接口”一词的预期含义无关。
您可以将类的公共成员视为外部接口。
例如,在 C++ 中没有interface
像在 Java 中那样。只能定义一个基类,定义一些虚成员函数,必须由派生类实现。
类声明包括public
,protected
和/或private
成员。protected 和 private 成员可以被视为“实现”细节,但不一定是该公共接口的实现。
接口包含方法的声明,这可以在头文件中找到。此头文件与出现此方法代码的一些源文件相关联。例如,您可以看到如何在 Eclipse CDT 中添加一个类。