C 调用静态方法

C++ calling a static method

本文关键字:静态方法 调用      更新时间:2023-10-16

假设您有以下类:

struct Foo {        
    static void print(std::string x) { std::cout << x << std::endl; }       
};

调用print(例如

)有什么区别
Foo foo; //Or a pointer...
foo.print("Hello world");

Foo::print("Hello world");

有明显的区别,即第一版必须构建和破坏Foo

然后有明显的相似性,两个版本在执行函数调用时执行相同的操作(构造字符串,打印等)。

不太明显的差异在于对两个表达式的评估。您会看到,即使呼叫不需要foo,它仍然作为表达式的一部分进行评估:

[class.static]/1

X类的静态成员可以使用合格的ID 表达式X :: S;不必使用类成员访问 语法是指静态成员。静态成员可以转介 使用类成员访问语法,在这种情况下为对象 评估表达式。

在您的情况下,这并不意味着任何意义。但是在某些情况下,它可以防止您的程序编译。例如,如果foo改为constexpr函数中的参考参数。

呼叫点没有区别。

是六个和六个。

Foo::print("Hello world");是更多习惯;一项约定已经成长,该惯例向读者发出信号,表明print可能是static函数。为此,在您的特殊情况下使用foo.print("Hello world");是特殊的,因此令人困惑。因此,请避免这种方式,特别是如果引入不必要的实例foo

请注意,如果要在复杂类层次结构中的另一种方法中达到print的特定覆盖,也可以使用使用示波器分辨率运算符的符号!因此,我对上面的可能使用

您的示例没有区别。请记住,静态变量在您班级的所有实例中共享。因此,您可以通过范围操作员或通过成员选择访问它们:

class A{
    public:
        A(){count++;}
        ~A(){count--;}
        static int count;
};
int A::count = 0;
int main(){
    A aObj, bObj, cObj;
    std::cout << "number of A instances: " << A::count << std::endl;
    std::cout << "number of A instances: " << aObj.count << std::endl;
    return 0;
}