【问题标题】:What's left for non-static functions c++?非静态函数 C++ 还剩下什么?
【发布时间】: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


【解决方案1】:

恭喜 - 您重新创建了 C 面向对象编程。这正是我们在 C 中执行 OOP 的方式。事实上,C++ 也是如此。它为每个名为this 的函数添加一个参数,该参数与其余参数一起推送。你明确地在做同样的事情。

为什么要使用成员函数呢?可读性。 myInstance.foo()myClass::foo(all, my, parameters, myInstance) 更具可读性

【讨论】:

  • 好吧,太好了,我有类似的感觉。现在我忍不住自嘲了。 :P 干杯 jrok 和 Gabe Sechan!
【解决方案2】:

当您调用非静态函数时。

Foo foo;
foo.doSomething(ArgType arg1, ArgType2 arg2,...);

这编译成。

Foo foo;
doSomething(&foo, ArgType arg1, ArgType2 arg2,...);

我回答了一个关于 Java 的类似问题 here,但在两种语言中的想法是一样的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-18
    • 2021-10-18
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多