我刚注意到我们可以通过成员选择运算符(。或 - >)访问c ++静态成员函数
例如:
class StaticTest
{
private:
int y;
static int x;
public:
StaticTest():y(100){
}
static int count()
{
return x;
}
int GetY(){return y;}
void SetY(){
y = this->count(); //#1 accessing with -> operator
}
};
以下是如何使用
StaticTest test;
printf_s("%d\n", StaticTest::count()); //#2
printf_s("%d\n", test.GetY());
printf_s("%d\n", test.count()); //#3 accessing with . operator
test.SetY();
用于访问成员函数中的静态成员函数的另一种#1样式是
void SetY(){
y = count(); //however, I regard it as
} // StaticTest::count()
但现在看起来更像是 this-> count() 。两种风格的呼唤有什么不同吗?
由于
答案 0 :(得分:2)
看看这个question。
根据标准(C ++ 03,9.4静态成员):
可以使用qualified-id引用类X的静态成员 表达式X :: s;没有必要使用类成员访问 语法(5.2.5)引用静态成员。静态成员可以是 引用使用类成员访问语法,在这种情况下 对象表达式进行评估。
因此,当你已经拥有一个对象并且你正在调用一个静态方法时,那么使用类成员访问语法没有区别。
如果你需要首先创建对象(通过直接实例化对象,或者通过调用某个函数),那么这个创建过程当然会占用一些额外的时间和内存。然而, this -Pointer永远不会传递给静态函数,无论它是如何编写的,调用本身都是一样的。
答案 1 :(得分:1)
我对你的第一个问题的答案感到有些困惑,但关于你的第二个问题:
<#>在#2(StaticTest::count()
)中,您以静态方式使用了count()方法,这意味着您在不创建StaticTest对象的情况下调用了该函数。
<#>在#3(test.count()
)中,您创建了一个名为test的StaticTest对象,并通过该对象调用该方法(即使它是不必要的。)
从功能上讲,没有区别,但#2是调用StaticMethods的首选方式。在不需要时创建对象是对内存的错误使用。
答案 2 :(得分:1)
C ++ 03,9.4静态成员
可以使用qualified-id表达式X :: s引用类X的静态成员;没有必要使用该课程 成员访问语法(5.2.5)来引用静态成员。静止的 可以使用类成员访问语法来引用成员 在哪种情况下评估object-expression。