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

这是一个小测试程序:


#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!”。


据我所知,不应在实例对象上调用静态成员方法。


我错了吗?从标准角度来看,此代码正确吗?

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


慕姐4208626
浏览 532回答 3
3回答

婷婷同学_

2)如果正确,那为什么呢?我找不到为什么会允许使用它,或者可能是为了帮助在模板中使用“静态或非静态”方法?在以下几种情况下可能很有用:[建议使用“模板中的“静态或非静态”方法“:]当可以为模板指定许多类型,然后该模板想要调用成员时:可以使用相同的符号来调用提供静态函数的类型。作为成员函数-前者可能更有效(没有this指向通过/绑定的指针),而后者允许多态(virtual)调度和成员数据的使用减少代码维护如果功能从需要实例的数据演变为不需要的数据-因此static可以轻松实现无实例使用并防止实例数据的意外使用-无需费力地更新现有客户端使用的所有方面如果更改了类型,则var.f()调用将继续使用该var类型的函数,而Type::f()可能需要手动更正当您有一个表达式或函数调用返回一个值并想调用(可能或始终)static函数时,该.表示法可能会阻止您需要使用decltype或支持模板来访问该类型,因此您可以使用该::表示法有时,变量名会更短,更方便或以更易于记录的方式命名

森林海

该标准指出,不必通过实例调用该方法,这并不意味着您不能执行该方法。甚至有一个使用它的示例:C ++ 03,9.4静态成员可以使用限定ID表达式X :: s来引用类X的静态成员;不必使用类成员访问语法(5.2.5)来引用静态成员。可以使用类成员访问语法来引用静态成员,在这种情况下,将评估对象表达式。class process {public:&nbsp; &nbsp;static void reschedule();};process& g();void f(){&nbsp; &nbsp;process::reschedule(); // OK: no object necessary&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;g().reschedule(); // g() is called}

DIEA

静态函数不需要实例化的对象即可调用,因此k.DoCrash();行为与Test::DoCrash();使用范围解析运算符(::)确定类内部的静态函数。注意,在这两种情况下,编译器都不会将this指针放在堆栈中,因为静态函数不需要它。
打开App,查看更多内容
随时随地看视频慕课网APP