【发布时间】:2014-06-08 07:13:00
【问题描述】:
这些天在我的代码中发生了一些奇怪的事情。每次我必须构建一个新的成员函数,或者每次我回到之前定义的成员函数时,我想:
“嘿,不管这个类的哪个实例调用它,这将是完全相同的进程,所以让我们将其设为静态!”
而且我也觉得它会减少内存消耗,因为每个实例都不必“携带”一个函数实现,对吗?
所以不要有类似的东西:
class Foo
{
int _attributes;
double methods(int parameters)
{
// do stuff using..
_attributes;
};
};
我最终得到的结果是:
class Foo
{
int _attributes;
static double methods(int parameters, Foo* instance)
{
// do stuff using..
instance->_attributes;
};
};
而且我看不到任何不会再以这种方式转换的功能。 所有我的函数都变成了静态的,我觉得某处有问题..
我错过了什么?再次使用非静态方法有什么用?呵呵
【问题讨论】:
-
“而且我也觉得它会减少内存消耗,因为每个实例都不必“携带”一个函数的实现,对吗?” 不,不是。对象不会“携带”它们的功能。相反,隐藏的
this指针在您调用它时作为参数传递 - 原则上与带有instance参数的static函数几乎相同。 -
您应该仅在不需要实例变量时才使用静态函数,否则正如 jrok 所指出的那样,您不会在效率方面节省任何东西,只会让您的代码更难阅读。作为一般经验法则,静态函数用于类规则/行为/算法,而不是与实例相关的任何内容。
-
我认为每个初学者程序员最终都会开始思考“对象在哪里以及如何存储它们的函数?”当他们从 OOP 开始时。我当然也这样做了:)
-
实际上有一种情况是类携带它的函数——在虚函数的情况下。然后它必须为每个虚函数有 1 个函数指针。这很便宜,您几乎可以忽略它,而且您通常不会将函数设为虚拟,除非您无论如何都需要它们。
-
您实际上已经达到了我多年前遇到的这一点。我认为点左边的实例只是另一个参数,只是它让方法在它的私有处达到峰值。你的静态方法做同样的事情只是因为它是同一个类。不必直观地检查它是否是同一个类是我宁愿阅读非静态语法的原因。
标签: c++ function static instance member