C++中类的声明将接口与该接口的实现结合在一起
The declaration of class in C++ combines the interface with the implementation of that interface?
我有一个关于类声明的问题。
我在一篇论文中读到了以下几行: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
限定符与继承有关,我认为不需要涵盖这一点来回答您的问题。
现在,上面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
。只能定义基类和一些虚拟成员函数,这些函数必须由派生类实现。
类声明包括public
、protected
和/或private
成员。受保护的成员和私有成员可以被视为"实现"细节,但不一定是公共接口的实现。
接口包含方法的声明,这可以在头文件中找到。此头文件与一些源文件相关,其中显示了此方法的代码。例如,您可以看到如何在EclipseCDT中添加一个类。
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 将图形属性与 std::unique_ptr 捆绑在一起
- 你能在 c++ 中将不同的数字类型加在一起吗?
- 如何将两个字符串加在一起,就好像它们是变量一样?
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 为什么push_back和emplace_back结合在一起时,会有不同的行为
- 在浮点精度成为一个问题之前,可以将多少个浮点值加在一起
- 为什么在template函数广播中把两个extensor表达式加在一起不正确
- 实现具有浮点键的类似哈希表的数据结构,其中公差内的值被合并在一起
- 如何在Qt TableView中将列的宽度调整为数据并将最后一部分拉伸在一起
- 接口在C++中是一种很好的做法吗?
- 编译器如何将链表中的地址字符串在一起?
- 在 c++ 中,两个日志行与 log4Cxx 混合在一起
- 如何将两个 jlong 数据类型转换为 jstring,然后将两个字符串连接在一起以便从 JNI 将字符串返回给 jav
- 将许多向量排序在一起
- C++ std:: 并包括它们如何组合在一起?
- 通过字符串迭代并将每个循环中的先前字符组合在一起
- 将非虚拟接口和多级继承结合在一起
- C++中类的声明将接口与该接口的实现结合在一起