C ++中的成员函数

时间:2011-11-20 11:25:47

标签: c++

  1. 要定义成员函数,我们可以使用内联函数说明符和静态或虚拟(但不是两者)说明符。
    为什么不两者

  2. 非静态成员函数可以包含const,volatile或两个函数限定符 怎么会有两个?如果它声明了const那么它怎么可能是volatile?

3 个答案:

答案 0 :(得分:9)

要定义成员函数,我们可以使用内联函数说明符和staticvirtual(但不是两者)说明符。 为什么不两者?

<强>答案:

virtual关键字表示运行时评估,这意味着在运行时基于this评估要调用的函数,这是可能的,因为隐藏的this指针被传递给隐式成员函数,如果函数标记为static,则this指针不会传递给成员函数。这是因为static表示该函数未与实例关联,但它属于该类。

从上面virtual ism无法在thisstatic指定的不是this的情况下工作。因此,staticvirtual无法同时应用于函数。

非静态成员函数可以包含constvolatile或两个函数限定符。 怎么会有两个?如果声明const,那么它如何volatile

答案:

const限定符表示该函数不会修改任何类成员。这就是函数内部的类成员immutable。但是,const函数仍然可以修改类定义中声明为mutable的类成员。

volatile限定符指示编译器不应用(禁用)任何优化。例如:通过缓存寄存器中的值而不是每次都从内存中读取它们。

鉴于上述情况,函数可以是constvolatile,它告诉编译器该函数不修改任何不可变类成员,但它可以修改mutable类成员和在处理特定函数时,编译器不应该应用自己的优化(例如基于寄存器的缓存)。

答案 1 :(得分:2)

1)static函数与类的实例无关。 virtual函数是多态的关键概念。即通过指针或对基类的引用来调用子实现,因此它们显然需要调用类的实例(与静态方法不同)。由于对象中存在vftable指针,因此可以进行虚拟调用,因此您需要一个对象来进行这些调用。

2)constvolatile完全不同。 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

总结:静态成员函数仅依赖于静态类型。虚拟成员函数依赖于具体对象