- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
纯虚函数是那些具有纯说明符(= 0;
)的虚成员函数
C++03 的第 10.4 条第 2 段 告诉我们什么是抽象类,并附带说明以下内容:
[注意:函数声明不能同时提供纯说明符和定义——尾注] [例子:
struct C {
virtual void f() = 0 { }; // ill-formed
};
——结束示例]
对于不太熟悉这个问题的人,请注意纯虚函数可以有定义,但上述条款禁止此类定义出现在行内 (类中的词汇)。 (对于定义纯虚函数的用法,您可能会看到,例如 this GotW)
现在对于所有其他种类和类型的函数,它可以提供一个类内定义,而且这个限制乍一看似乎完全是人为的和莫名其妙的。想想看,第二眼和随后的眼光似乎都是这样 :) 但我相信如果没有具体原因,限制就不会存在。
我的问题是:有人知道这些具体原因吗? 好的也欢迎猜测。
注意事项:
inline
一词并非指inline 关键字。它应该表示在类中的词法最佳答案
在 SO 线程 "Why is a pure virtual function initialized by 0?" Jerry Coffin 提供了 Bjarne Stroustrup 的 The Design & Evolution of C++ 中的这句话。 ,第 13.2.3 节,我在其中添加了一些我认为相关的部分的重点:
The curious
=0
syntax was chosen over the obvious alternative of introducing a new keyword pure or abstract because at the time I saw no chance of getting a new keyword accepted. Had I suggested pure, Release 2.0 would have shipped without abstract classes. Given a choice between a nicer syntax and abstract classes, I chose abstract classes. Rather than risking delay and incurring the certain fights over pure, I used the tradition C and C++ convention of using 0 to represent "not there." The=0
syntax fits with my view that a function body is the initializer for a function and also with the (simplistic, but usually adequate) view of the set of virtual functions being implemented as a vector of function pointers. [ … ]
因此,在选择语法时,Bjarne 将函数体视为声明器的一种初始化部分,而 =0
作为初始化器的另一种形式,表示“没有主体” (或者用他的话来说,“不存在”)。
理所当然地,一个人不能既表示“不存在”又拥有一个 body ——在那个概念图中。
或者,仍然在那个概念图中,有两个初始化器。
现在,这就是我的心灵感应能力、google-foo 和软推理能力。我推测没有人足够感兴趣™ 向委员会提出关于取消这种纯粹的句法限制并跟进所有工作的提案。所以还是这样。
关于c++ - 纯虚函数可能没有内联定义。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4174694/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!