如何从C+中的类成员函数自身定义递归调用该类成员函数+;? 我是C++的新手,我需要一个类成员函数来调用它自己的定义,比如这个-< class MyClass { public: // or private: ? // Some code here // ... void myfunction(); // ... }; void MyClass::myfunction() { // Some code here // ... // Call MyClass::myfunction() here, but how? // ... }

如何从C+中的类成员函数自身定义递归调用该类成员函数+;? 我是C++的新手,我需要一个类成员函数来调用它自己的定义,比如这个-< class MyClass { public: // or private: ? // Some code here // ... void myfunction(); // ... }; void MyClass::myfunction() { // Some code here // ... // Call MyClass::myfunction() here, but how? // ... },c++,function,class,c++11,C++,Function,Class,C++11,但是我不知道它的正确语法,如果可能的话,如果不创建这样的对象-object\u name.member\u function() 而且,如果myfunction()属于public:或private:,会有什么区别吗?由于函数不是静态的,您已经有了一个实例可以操作了 void MyClass::myfunction() { // Some code here // ... this->myfunction(); // ... } 您可以将this->关

但是我不知道它的正确语法,如果可能的话,如果不创建这样的对象-
object\u name.member\u function()


而且,如果
myfunction()
属于
public:
private:
,会有什么区别吗?

由于函数不是静态的,您已经有了一个实例可以操作了

void MyClass::myfunction()
{
    // Some code here
    // ...

    this->myfunction();

    // ...
}
您可以将
this->
关闭,我只是想更清楚地了解如何调用函数。

myfunction()
在类的范围内,因此您可以“简单地”调用它:

但是,请注意,这将导致堆栈溢出。您需要一种停止递归的方法

但是我不知道它的正确语法,如果可能的话,如果不创建这样的对象-
object\u name.member\u function()

使用:

this->mufunction()
可以替换为
myfunction()
。使用
是一种风格选择,可以让像我这样的人更容易阅读代码

如果
myfunction()
属于
public:
private:
,会有什么区别吗


不,不会的。您可以从另一个成员函数调用该类的任何成员函数

成员函数实际上是语法糖的一种形式。它们描述了一个函数,该函数以某种方式秘密地获取指向对象实例的指针,该对象实例在函数内部可作为
this
访问

struct Foo {
    vod bar();
};

Foo foo;
foo.bar();
在这里的调用中,您真正要做的是调用
Foo::bar(&Foo)
bar
实际上是在用指针
Foo*这个
。实现方式因实现而异,一些编译器/体系结构将使用特殊寄存器来跟踪当前对象

另外一个语法糖块使成员函数中的所有成员变量和函数对您可见,就好像它们是局部作用域一样

struct Foo {
    int i;
    int add(int n) {
        return i + n;
    }
    int addx2(int n) {
        return add(n) * 2;
    }
};
这里实际发生的是:

return this->i + n;

这意味着很容易遇到本地名称和成员名称之间存在冲突的情况

struct Foo {
    int i;
    Foo(int i) {
        i = i; // not what you expected
    }
};
出于这个原因,许多工程师小心地使用大小写或前缀或后缀来帮助他们区分成员、参数和变量

struct Foo { // Uppercase for types and functions
    int m_i;  // m_ for member
    Foo(int i_, int j_) {
        int i = sqrt(i));
        m_i = i + j_;
    }
    int Add(int i) {
        return i_ + i;
    }
};
人们使用各种不同的模式-一些人使用
\u name
表示成员,一些人使用
name
fn
表示成员

struct Foo {
    int i_;
    int add_(int _i) {
        return i_ + _i;
    }
};

最重要的是要保持一致。

myfunction()
是正确的,如果您在正确的范围内。请确保
myfunction()
的函数定义正确(即它在声明和定义中都指定了返回类型)。对不起,我忘了写返回类型。
这个->
在这里是不必要的,不是吗?因为范围是隐式的。有没有理由不建议只使用
myfunction()
@EyasSH是的,正如我提到的,这是不必要的,我用它来说明一点,即函数正在从对象的当前实例中调用。谢谢。我正在使用的函数有一个停止递归的基本条件,这里的代码只是为了理解这个问题。谢谢你回答中的最后一行。你可以省略显式的
this->
,直接称它为
myfunction()
。@RemyLebeau:是的,我可以。科里克拉默的回答也是如此。
struct Foo {
    int i;
    Foo(int i) {
        i = i; // not what you expected
    }
};
struct Foo { // Uppercase for types and functions
    int m_i;  // m_ for member
    Foo(int i_, int j_) {
        int i = sqrt(i));
        m_i = i + j_;
    }
    int Add(int i) {
        return i_ + i;
    }
};
struct Foo {
    int i_;
    int add_(int _i) {
        return i_ + _i;
    }
};