以下4种样式调用其他成员方法有什么区别?
What's the difference between following 4 styles call other member method?
以下 4 种调用另一个成员函数的样式有什么区别?
是否有任何好处导致一种方法是可取的?
void Object::trigger() {
(*this).triggerinner(10);
this->triggerinner(10);
triggerinner(10);
Object::triggerinner(10);
}
void Object::triggerinner(int x) {
std::cout << "trigger" << std::endl;
}
前三个在非模板代码中基本相同。在模板成员函数中,前两个使名称查找依赖(因此编译器可以在依赖关系中找到名称基类)。 一般来说,越简单越好,所以大多数人都喜欢第三种形式,除非需要依赖查找,在这种情况下,他们将使用第二个。
第四种形式阻止虚拟分辨率。 (它有,在事实上,与上述三种形式相同,即 this->Object::triggerinner(10)
等) 当你使用它时想要强制分辨率:调用的函数将在 Object
或 Object
的基类中,但从不派生类,即使函数是虚拟的。 这是最常用的在派生类中,在之前调用基类实现(或之后)做额外的工作:
void
Derived::func()
{
Base::func();
// Additional work here...
}
在成员函数之外,它还可用于调用没有对象时的静态成员函数。
前两者完全等价。根据定义,(*p).thing
和 p->thing
对于任何指针都是等效的。
在这种情况下,第三个是等效的;但如果成员函数的名称被本地声明隐藏,则可能具有不同的含义。在某些情况下(函数是基类的成员,并且涉及模板),当此窗体找不到该函数时,在这种情况下,您必须使用其他窗体之一。
如果函数不是虚拟的,则第四个是等效的。如果它是虚拟的,那么这将强制对此类中可用的覆盖进行非虚拟调用,而不是最终覆盖。
(*this).triggerinner(10);
这很丑陋,"->"是为了避免这样做。
this->triggerinner(10);
这很好,但this->
不是强制性的。如果您正在处理现有项目,请保留当前的编码样式。
triggerinner(10);
很好,与使用this->
的解决方案相同的评论.
Object::triggerinner(10);
将其用于静态方法。
我建议您使用triggerinner(10)
因为它简短明了。
是this->triggerinner(10);。它使用指针与表轻松匹配的原因。
this->triggerinner(10)
比其他的更好:
- 比
(*this).triggerinner(10)
更好,因为它更具可读性。 - 比
triggerinner(10)
更好,因为在这种情况下,您将不知道triggerinner()
是一个方法还是一个函数(然后具有不同的范围)。 - 优于主要用于静态方法的
Object::triggerinner(10)
(但不仅如此)
没有区别,除非你的编译器做了一些时髦的事情。尝试阅读函数中的行生成的汇编语言,看看是否有任何差异,或者它是否是一遍又一遍生成的同一指令块。
至于"最好"或"最受欢迎"的,这取决于您的个人喜好,或者在公司工作时,他们可能会强制执行某些编码标准,迫使您在每次做某事时都以特定的方式编写。
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::enable_if 和 std::enable_if_t 有什么区别?