要定义成员函数,我们可以使用内联函数说明符和静态或虚拟(但不是两者)说明符。
为什么不两者?
非静态成员函数可以包含const,volatile或两个函数限定符 怎么会有两个?如果它声明了const那么它怎么可能是volatile?
答案 0 :(得分:9)
要定义成员函数,我们可以使用内联函数说明符和static
或virtual
(但不是两者)说明符。
为什么不两者?
<强>答案:强>
virtual
关键字表示运行时评估,这意味着在运行时基于this
评估要调用的函数,这是可能的,因为隐藏的this
指针被传递给隐式成员函数,如果函数标记为static
,则this
指针不会传递给成员函数。这是因为static
表示该函数未与实例关联,但它属于该类。
从上面virtual
ism无法在this
和static
指定的不是this
的情况下工作。因此,static
和virtual
无法同时应用于函数。
非静态成员函数可以包含const
,volatile
或两个函数限定符。
怎么会有两个?如果声明const
,那么它如何volatile
?
答案:
const
限定符表示该函数不会修改任何类成员。这就是函数内部的类成员immutable
。但是,const
函数仍然可以修改类定义中声明为mutable
的类成员。
volatile
限定符指示编译器不应用(禁用)任何优化。例如:通过缓存寄存器中的值而不是每次都从内存中读取它们。
鉴于上述情况,函数可以是const
而volatile
,它告诉编译器该函数不修改任何不可变类成员,但它可以修改mutable
类成员和在处理特定函数时,编译器不应该应用自己的优化(例如基于寄存器的缓存)。
答案 1 :(得分:2)
1)static
函数与类的实例无关。 virtual
函数是多态的关键概念。即通过指针或对基类的引用来调用子实现,因此它们显然需要调用类的实例(与静态方法不同)。由于对象中存在vftable指针,因此可以进行虚拟调用,因此您需要一个对象来进行这些调用。
2)const
和volatile
完全不同。 const
表示您无法修改不可变类成员,volatile
表示从处理中删除所有优化,以防止跳过检查或修改mutable
成员。考虑到您可以拥有mutable
个成员,这些成员可以volatile
并由const
个功能进行修改。
答案 2 :(得分:1)
这是思考问题1的另一种方式:
virtual
概念意味着运行时行为取决于具体的对象实例。假设您有一个Base * p
并且您致电p->foo()
。然后决定调用哪个实际函数取决于p
实际指向的具体对象。
另一方面,static
成员函数是类函数,这意味着它们只是类的属性(即类型),而不是一个对象。虚拟概念对静态成员函数没有意义,因为没有与对象的连接。静态成员函数仅根据变量的 static 类型进行选择,如果有的话:
struct Base { static void bar(); virtual ~Base() {} };
Base * p;
p->bar(); // irrelevant what `p` actually points to
Base::bar(); // better syntax, indicates that this has nothing to do with p
总结:静态成员函数仅依赖于静态类型。虚拟成员函数依赖于具体对象。