C++中的成员函数

Member Functions in C++

本文关键字:函数 成员 C++      更新时间:2023-10-16
  1. 要定义成员函数,我们可以使用内联函数说明符和静态或虚拟(但不能同时使用两者(说明符
    为什么不同时

  2. 非静态成员函数可以具有const、volatile或同时具有这两个函数限定符
    它怎么可能两者都有?如果它声明了const,那么它怎么可能是volatile呢?

要定义成员函数,我们可以使用内联函数说明符和staticvirtual(但不能同时使用两者(说明符。为什么两者都不呢

答案:

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

从以上内容来看,virtual在没有thisstatic指定没有this的情况下是不起作用的。因此CCD_ 13和CCD_。

非静态成员函数可以具有constvolatile或同时具有这两个函数限定符。它怎么可能两者都有?如果它声明了const,那么它怎么可能是volatile

答案:

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

volatile限定符指示编译器不应用(禁用(任何优化的For ex:通过将值缓存在寄存器中而不是每次从内存中读取值。

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

1(static函数不与类的实例关联。CCD_ 28功能是多态性的一个重要概念。也就是说,通过对基类的指针或引用来调用子实现,因此它们显然需要调用类的实例(与静态方法不同(。虚拟调用之所以可能,是因为对象中存在vftable指针,所以需要一个对象来进行这些调用。

2( const和CCD_。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

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