繁体   English   中英

C ++中的成员函数

[英]Member Functions in C++

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

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

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

回答:

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

从上面virtual主义不能在没有工作, thisstatic指定的没有this 因此staticvirtual不能同时应用于函数。

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

回答:

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

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

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

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM