C++中的成员函数
Member Functions in C++
-
要定义成员函数,我们可以使用内联函数说明符和静态或虚拟(但不能同时使用两者(说明符
为什么不同时? -
非静态成员函数可以具有const、volatile或同时具有这两个函数限定符
它怎么可能两者都有?如果它声明了const,那么它怎么可能是volatile呢?
要定义成员函数,我们可以使用内联函数说明符和static
或virtual
(但不能同时使用两者(说明符。为什么两者都不呢
答案:
virtual
关键字表示运行时评估,这意味着在运行时根据this
评估要调用的函数,这是可能的,因为隐藏的this
指针会隐式传递给成员函数。如果函数标记为static
,则this
指针不会传递给成员功能。这是因为static
表示函数不与实例关联,但它属于类。
从以上内容来看,virtual
在没有this
和static
指定没有this
的情况下是不起作用的。因此CCD_ 13和CCD_。
非静态成员函数可以具有const
、volatile
或同时具有这两个函数限定符。它怎么可能两者都有?如果它声明了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
摘要:静态成员函数仅依赖于静态类型。虚拟成员函数依赖于具体对象。
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针