[英]Member Functions in C++
要定义成员函数,我们可以使用内联函数说明符和静态或虚拟(但不是两者)说明符。
为什么不两个 ?
非静态成员函数可以具有const,volatile或两个函数限定符。
怎么会有两个? 如果它声明了const那么它怎么会变化?
要定义成员函数,我们可以使用内联函数说明符和static
或virtual
(但不是两者)说明符。 为什么不兼得?
回答:
virtual
关键字表示运行时评估,这意味着在运行时基于this
计算要调用的函数,这是可能的,因为隐藏的this
指针隐式传递给成员函数,如果函数被标记为static
那么this
指针是没有传入成员函数。 这是因为static
表示该函数未与实例关联,但它属于该类。
从上面virtual
主义不能在没有工作, this
与static
指定的没有this
。 因此static
和virtual
不能同时应用于函数。
非静态成员函数可以具有const
, volatile
或两个函数限定符。 怎么会有两个? 如果它声明了const
那么它怎么会volatile
?
回答:
const
限定符表示该函数不会修改任何类成员。 也就是说,类成员在函数内部是immutable
但是, const
函数仍然可以修改在类定义中声明为mutable
类成员。
volatile
限定符指示编译器不应用(禁用)任何优化。例如:通过缓存寄存器中的值而不是每次都从内存中读取它们。
鉴于上述情况,函数可以是const
而且是volatile
,它告诉编译器此函数不修改任何不可变类成员,但它可以修改mutable
类成员,并且编译器不应该应用自己的优化(例如基于寄存器的缓存)在处理该特定功能时。
1) static
函数与类的实例无关。 virtual
函数是多态的关键概念。 即通过指针或对基类的引用来调用子实现,因此它们显然需要调用类的实例(与静态方法不同)。 由于对象中存在vftable指针,因此可以进行虚拟调用,因此您需要一个对象来进行这些调用。
2) const
和volatile
完全不同。 const
意味着你不能修改不可变的类成员, volatile
意味着从处理中去除所有优化以防止跳过检查或修改mutable
成员。 考虑到,你可以有帐户mutable
成员,这既可以是volatile
,并通过修改const
功能。
这是思考问题1的另一种方式:
virtual
概念意味着运行时行为取决于具体的对象实例 。 假设你有一个Base * p
并且你调用p->foo()
。 然后决定调用哪个实际函数取决于p
实际指向的具体对象。
另一方面, 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
简介:静态成员函数仅依赖于静态类型 。 虚拟成员函数取决于具体对象 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.