为了账号安全,请及时绑定邮箱和手机立即绑定

类实例上的C ++静态成员方法调用

类实例上的C ++静态成员方法调用

C++
慕姐4208626 2019-11-18 14:21:01
这是一个小测试程序:#include <iostream>class Test{public:    static void DoCrash(){ std::cout<< "TEST IT!"<< std::endl; }};int main(){    Test k;    k.DoCrash(); // calling a static method like a member method...    std::system("pause");    return 0;}在VS2008 + SP1(vc9)上,它可以正常编译:控制台仅显示“ TEST IT!”。据我所知,不应在实例对象上调用静态成员方法。我错了吗?从标准角度来看,此代码正确吗?如果正确,那为什么呢?我找不到为什么会允许使用它,或者可能是为了帮助在模板中使用“静态或非静态”方法?
查看完整描述

3 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

2)如果正确,那为什么呢?我找不到为什么会允许使用它,或者可能是为了帮助在模板中使用“静态或非静态”方法?

在以下几种情况下可能很有用:

  • [建议使用“模板中的“静态或非静态”方法“:]当可以为模板指定许多类型,然后该模板想要调用成员时:可以使用相同的符号来调用提供静态函数的类型。作为成员函数-前者可能更有效(没有this指向通过/绑定的指针),而后者允许多态(virtual)调度和成员数据的使用

  • 减少代码维护

    • 如果功能从需要实例的数据演变为不需要的数据-因此static可以轻松实现无实例使用并防止实例数据的意外使用-无需费力地更新现有客户端使用的所有方面

    • 如果更改了类型,则var.f()调用将继续使用该var类型的函数,而Type::f()可能需要手动更正

  • 当您有一个表达式或函数调用返回一个值并想调用(可能或始终)static函数时,该.表示法可能会阻止您需要使用decltype或支持模板来访问该类型,因此您可以使用该::表示法

  • 有时,变量名会更短,更方便或以更易于记录的方式命名


查看完整回答
反对 回复 2019-11-18
?
森林海

TA贡献2011条经验 获得超2个赞

该标准指出,不必通过实例调用该方法,这并不意味着您不能执行该方法。甚至有一个使用它的示例:


C ++ 03,9.4静态成员


可以使用限定ID表达式X :: s来引用类X的静态成员;不必使用类成员访问语法(5.2.5)来引用静态成员。可以使用类成员访问语法来引用静态成员,在这种情况下,将评估对象表达式。


class process {

public:

   static void reschedule();

};


process& g();


void f()

{

   process::reschedule(); // OK: no object necessary             

   g().reschedule(); // g() is called

}


查看完整回答
反对 回复 2019-11-18
?
DIEA

TA贡献1820条经验 获得超2个赞

静态函数不需要实例化的对象即可调用,因此


k.DoCrash();

行为与


Test::DoCrash();

使用范围解析运算符(::)确定类内部的静态函数。


注意,在这两种情况下,编译器都不会将this指针放在堆栈中,因为静态函数不需要它。


查看完整回答
反对 回复 2019-11-18
  • 3 回答
  • 0 关注
  • 531 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信