- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在他的两本书中
C++ 编程语言,2013 年(第 4 版)和C++ 之旅,2013 年
Bjarne Stroustrup 写道:
Types such as complex ... are called concrete types because their representation is part of their definition.
以下内容在一定程度上澄清了上述说法:
In that, they resemble built-in types. In contrast, an abstract type is a type that completely insulates a user from implementation details. To do that, we decouple the interface from the representation and give up genuine local variables. Since we don’t know anything about the representation of an abstract type (not even its size), we must allocate objects on the free store and access them through references or pointers.
在短语“...他们的表示是他们定义的一部分。”
类型表示是什么意思?也就是说,究竟表示什么:对象在内存中的布局?该类型持有的私有(private)和公共(public)数据?还是别的?
类型定义是什么意思?
类型表示和定义的这些典型含义是否与 C++ 相关?
我决定做更多的研究,并检查了其他来源。首先,我查看了说明 C++ 编程语言实现要求的 ISO/IEC 14882:2011 规范,然后查看了其他来源。
我无法在 ISO 规范中找到任何类似“类型表示”或“类型表示”的内容。相反,有 2 个与对象相关的术语:
The object representation of an object of type
T
is the sequence of Nunsigned char
objects taken up by the object of typeT
, where N equalssizeof(T)
.The value representation of an object is the set of bits that hold the value of type
T
. For trivially copyable types, the value representation is a set of bits in the object representation that determines a value, which is one discrete element of an implementation-defined set of values.
所以在我看来,术语类型表示在 ISO 标准中没有任何常规含义。
好的。也许这是 ISO 标准之外的东西?让我们看看是什么 Linux Standard Base C++ Specification 3.1 > Chapter 7. C++ Class Representations > 7.1. C++ Data Representation说:
An object file generated by the compilation process for a C++ program shall contain several closely related internal objects, or Class Components, to represent each C++ Class. Such objects are not a visible part of the source code. The following table describes these Class Components at a high level.
Table Class Components
Object.......................Contains=----------------------------------------=Class Data...................Class membersVirtual Table................Information needed to dispatch virtual functions, access virtual base class subobjects and to access the RTTI informationRTTI.........................Run-Time Type Information used by the typeid and dynamic_cast operators, and exception handlersTypeinfo Name................String representation of Class nameConstruction Virtual Table...Information needed during construction and destruction of Classes with non-trivial inheritance relationships.VTT..........................A table of virtual table pointers which holds the addresses of construction and non-construction virtual tables.
我再次无法在 ISO 规范中找到对类型定义的明确解释。
相反,我发现了以下内容:
A declaration may introduce one or more names into a translation unit... A class declaration introduces the class name into the scope where it is declared...A declaration is a definition unless [I removed things not directly related to the class declaration], ... it is a class name declaration...
这是 Microsoft 对同一事物的解释:
C++ Declarations - MSDN - Microsoft
A declaration introduces one or more names into a program. Declarations can occur more than once in a program...Declarations also serve as definitions, except when the declaration:...;Is a class name declaration with no following definition, such as class T;...
和
C++ Definitions - MSDN - Microsoft
A definition is a unique specification of an object or variable, function, class, or enumerator. Because definitions must be unique, a program can contain only one definition for a given program element. There can be a many-to-one correspondence between declarations and definitions. There are two cases in which a program element can be declared and not defined: A function is declared but never referenced with a function call or with an expression that takes the function's address. A class is used only in a way that does not require its definition be known.
例子:
struct S; // declares, but not defines S
class T {}; // declares, and defines T
class P { int a;}; // declares, and defines P, P::a
候选答案N1:
由 Jonathan Wakely 提议
(以下是我的理解)
短语“类型如复杂......被称为具体类型,因为它们的表示是它们定义的一部分”应该按以下方式解释和理解:
● their(=type) definition是一个c++技术术语,其含义是约定俗成的,可以在c++规范中找到;
● their(=type) representation(根据 Jonathan Wakely 的说法)在这种情况下不是一个技术性的 c++ 术语,但任何懂英语的人都可以很容易地理解它的含义(并且可能,这是我的猜测,之前已经接触过大量的 C++ 代码和文本)。这种情况下的类型表示意味着“定义类型及其作用的属性”,即:
“对于具体类型:其成员的类型和布局”,
“对于抽象类型:其成员函数及其可观察的行为”
● 整个短语 then(我们谈论的是具体类)翻译为:
“类型,例如复杂的......被称为具体类型,因为其成员的类型和布局是其定义的一部分”
我认为这种解释是有道理的,可以理解的,并且与BS书籍中的解释也很吻合。
如果这里有什么不对请指正**
最佳答案
QUESTIONS: in the phrase "...their representation is part of their definition." 1) What is the meaning of type representation? (that is, the representation of WHAT exactly: object layout in memory or private and public data that the type holds OR something else) 2) What is the meaning of type definition? 3) Are these typical meanings of type representation and definition as related to c++?
您要询问 Stroustrup 在您引用的文本中没有使用的术语的含义!
他并没有像 C++ 标准那样尝试定义诸如“类型表示”之类的术语的正式规范,他正在撰写更为非正式的散文。您找到的所有对技术术语的引用都是误导性的,并且不直接相关。
(that is, the representation of WHAT exactly: object layout in memory or private and public data that the type holds OR something else)
是的,你提到的这两件事。对于具体类型,定义它是什么以及它做什么的属性包括其成员的类型和布局。即它在源代码中的表示方式。
对于一个抽象类,定义它是什么和它做什么的属性是它的成员函数和它们的可观察行为。它如何产生可观察行为的细节不一定重要,有时甚至在源代码中不可见,因为您实际上使用了在另一段代码中定义的一些具体类,并且仅通过抽象接口(interface)使用它。
编辑:从您在下面写的评论来看,您显然错过了我试图给您答案的内容。我上面写的是指定义什么是类型及其作用的属性。那是“类型的定义”。
如果您必须为用户编写 C++ 类型的文档,您将如何定义它?
对于具体类型,您可以描述其成员的类型,从而根据其成员的属性定义其某些属性。例如“一个 std::complex<float>
存储两个 float
成员,代表复数的实部和虚部。”这告诉你 std::complex<float>
只能存储与 float
精度相同的复数,即它的精度取决于它用两个 float
表示的事实成员。
对于抽象类,您将描述其成员函数的行为,这可能是 virtual
,因此您根据其遵循的接口(interface)而不是其实现的细节来描述它。
但它们不是正式术语,我认为您将它们视为严格的技术术语是错误的。他只是在使用具有通常英语含义的单词。
关于c++ - 它们的表示是它们与 C++ 具体类型相关的定义的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25853450/
我正在尝试编写一个相当多态的库。我遇到了一种更容易表现出来却很难说出来的情况。它看起来有点像这样: {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE
谁能解释一下这个表达式是如何工作的? type = type || 'any'; 这是否意味着如果类型未定义则使用“任意”? 最佳答案 如果 type 为“falsy”(即 false,或 undef
我有一个界面,在IAnimal.fs中, namespace Kingdom type IAnimal = abstract member Eat : Food -> unit 以及另一个成功
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
在 C# 中,default(Nullable) 之间有区别吗? (或 default(long?) )和 default(long) ? Long只是一个例子,它可以是任何其他struct类型。 最
假设我有一个案例类: case class Foo(num: Int, str: String, bool: Boolean) 现在我还有一个简单的包装器: sealed trait Wrapper[
这个问题在这里已经有了答案: Create C# delegate type with ref parameter at runtime (1 个回答) 关闭 2 年前。 为了即时创建委托(dele
我正在尝试获取图像的 dct。一开始我遇到了错误 The function/feature is not implemented (Odd-size DCT's are not implemented
我正在尝试使用 AFNetworking 的 AFPropertyListRequestOperation,但是当我尝试下载它时,出现错误 预期的内容类型{( “应用程序/x-plist” )}, 得
我在下面收到错误。我知道这段代码的意思,但我不知道界面应该是什么样子: Element implicitly has an 'any' type because index expression is
我尝试将 SignalType 从 ReactiveCocoa 扩展为自定义 ErrorType,代码如下所示 enum MyError: ErrorType { // .. cases }
我无法在任何其他问题中找到答案。假设我有一个抽象父类(super class) Abstract0,它有两个子类 Concrete1 和 Concrete1。我希望能够在 Abstract0 中定义类
我想知道为什么这个索引没有用在 RANGE 类型中,而是用在 INDEX 中: 索引: CREATE INDEX myindex ON orders(order_date); 查询: EXPLAIN
我正在使用 RxJava,现在我尝试通过提供 lambda 来订阅可观察对象: observableProvider.stringForKey(CURRENT_DELETED_ID) .sub
我已经尝试了几乎所有解决问题的方法,其中包括。为 提供类型使用app.use(express.static('public'))还有更多,但我似乎无法为此找到解决方案。 index.js : imp
以下哪个 CSS 选择器更快? input[type="submit"] { /* styles */ } 或 [type="submit"] { /* styles */ } 只是好
我不知道这个设置有什么问题,我在 IDEA 中获得了所有注释(@Controller、@Repository、@Service),它在行号左侧显示 bean,然后转到该 bean。 这是错误: 14-
我听从了建议 registering java function as a callback in C function并且可以使用“简单”类型(例如整数和字符串)进行回调,例如: jstring j
有一些 java 类,加载到 Oracle 数据库(版本 11g)和 pl/sql 函数包装器: create or replace function getDataFromJava( in_uLis
我已经从 David Walsh 的 css 动画回调中获取代码并将其修改为 TypeScript。但是,我收到一个错误,我不知道为什么: interface IBrowserPrefix { [
我是一名优秀的程序员,十分优秀!