我是C ++的新手,我需要一个类成员函数来调用自己的定义,就像这样 -
class MyClass {
public: // or private: ?
// Some code here
// ...
void myfunction();
// ...
};
void MyClass::myfunction()
{
// Some code here
// ...
// Call MyClass::myfunction() here, but how?
// ...
}
但是我不知道它的正确语法,如果可能的话,如果不创建通常这样做的对象 - object_name.member_function()
,它怎么能自己调用呢?
而且,如果myfunction()
属于public:
或private:
,会有什么不同吗?
答案 0 :(得分:10)
由于该功能不是静态的,您已经做有一个实例来操作
this->
你可以关闭{{1}},我只是更清楚如何调用这个函数。
答案 1 :(得分:4)
myfunction()
属于班级范围,因此您可以“简单地”调用它:
class MyClass {
public:
// Some code here
// ...
void myfunction();
// ...
};
void MyClass::myfunction()
{
myfunction();
}
但请注意,这会导致堆栈溢出。你需要一种方法来阻止递归。
答案 2 :(得分:1)
但是我不知道它的正确语法,如果可能的话,如果不创建通常这样做的对象 -
object_name.member_function()
,它怎么能自己调用呢?
使用:
void MyClass::myfunction()
{
// Some code here
// ...
// Call MyClass::myfunction() here, but how?
// One way to call the function again.
this->myfunction();
// ...
}
this->mufunction()
可以由myfunction()
替换。使用this
是一种风格选项,可以让代码更容易阅读,就像我一样。
而且,如果
myfunction()
属于public:
或private:
,会有什么不同吗?
不,不会有。您可以从另一个成员函数调用该类的任何成员函数。
答案 3 :(得分:1)
成员函数实际上是一种语法糖。它们描述了一个函数,它以某种方式秘密地获取一个指向对象实例的指针,该对象实例在函数内部可以作为function initialize() {
var input = document.getElementById('autocomplete');
var options = {componentRestrictions: {country: 'nl'}};
new google.maps.places.Autocomplete(input, options);
}
google.maps.event.addDomListener(window, 'load', initialize);
访问。
this
你在电话会议中真正做的是调用struct Foo {
vod bar();
};
Foo foo;
foo.bar();
而Foo::bar(&foo);
正在使用指针bar
。如何完成从实现到实现,一些编译器/架构将使用特殊寄存器来跟踪当前对象。
另一段语法糖使得所有成员变量和函数在成员函数中可见,就像它们是本地作用域一样
Foo* this
这里实际发生的是:
struct Foo {
int i;
int add(int n) {
return i + n;
}
int addx2(int n) {
return add(n) * 2;
}
};
和
return this->i + n;
这意味着很容易遇到本地名称和成员名称之间存在冲突的情况。
return this->add(n) * 2;
出于这个原因,许多工程师小心使用案例或前缀或后缀来帮助他们区分成员,参数和变量。
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;
}
};
来表示成员,有些人使用_name
和name_
来表示成员。
fn_
最重要的是要保持一致。