我对 C++ 相当陌生,我不明白this
指针在以下场景中的作用:
void do_something_to_a_foo(Foo *foo_instance);
void Foo::DoSomething()
{
do_something_to_a_foo(this);
}
我从这里的其他人的帖子中抓住了它。
this
指向什么?我很困惑。该函数没有输入,那么在this
做什么呢?
this
指当前对象。
关键字this
标识一种特殊类型的指针。假设您创建了一个名为x
of的对象class A
,并且class A
具有一个非静态成员函数f()
。如果调用该函数,主体中x.f()
的关键字存储的地址。this
f()
x
简短的回答是这this
是一个特殊的关键字,用于标识“this”对象——您当前正在操作的对象。稍长,更复杂的答案是这样的:
当你有 aclass
时,它可以有两种类型的成员函数:static
和非static
. 非static
成员函数必须对类的特定实例进行操作,并且它们需要知道该实例在哪里。为了帮助他们,该语言定义了一个隐式变量(即在需要时自动为您声明的变量,而无需您做任何事情),该变量将被调用this
并将自动指向该类的特定实例成员函数正在运行。
考虑这个简单的例子:
#include <iostream>
class A
{
public:
A()
{
std::cout << "A::A: constructed at " << this << std::endl;
}
void SayHello()
{
std::cout << "Hi! I am the instance of A at " << this << std::endl;
}
};
int main(int, char **)
{
A a1;
A a2;
a1.SayHello();
a2.SayHello();
return 0;
}
当您编译并运行它时,观察 和 之间的值this
是不同a1
的a2
。
this
只是一些关于补充其他答案的随机事实:
class Foo {
public:
Foo * foo () { return this; }
const Foo * cfoo () const { return this; /* return foo(); is an error */ }
};
Foo x; // can call either x.foo() or x.cfoo()
const Foo y; // can only call x.cfoo()
当对象为const
时, 的类型this
变为指向 的指针const
。
class Bar {
int x;
int y;
public:
Bar () : x(1), y(2) {}
void bar (int x = 3) {
int y = 4;
std::cout << "x: " << x << std::endl;
std::cout << "this->x: " << this->x << std::endl;
std::cout << "y: " << y << std::endl;
std::cout << "this->y: " << this->y << std::endl;
}
};
this
指针可用于访问被函数参数或局部变量覆盖的成员。
template <unsigned V>
class Foo {
unsigned v;
public:
Foo () : v(V) { std::cout << "<" << v << ">" << " this: " << this << std::endl; }
};
class Bar : public Foo<1>, public Foo<2>, public Foo<3> {
public:
Bar () { std::cout << "Bar this: " << this << std::endl; }
};
多重继承会导致不同的父级具有不同的this
值。只有第一个继承的父对象具有与this
派生对象相同的值。
this是指向 self(调用this的对象)的指针。
假设你有一个名为 car 的类 Car 的对象,它有一个非静态方法 getColor(),在 getColor() 中对 this 的调用会返回 car 的地址(类的实例)。
静态成员函数没有this指针(因为它们与实例无关)。
这意味着调用 DoSomething() 的 Foo 对象。我用例子来解释
void do_something_to_a_foo(Foo *foo_instance){
foo_instance->printFoo();
}
和我们班
class Foo{
string fooName;
public:
Foo(string fName);
void printFoo();
void DoSomething();
};
Foo::Foo(string fName){
fooName = fName;
}
void Foo::printFoo(){
cout<<"the fooName is: "<<fooName<<endl;
}
void Foo::DoSomething(){
do_something_to_a_foo(this);
}
现在我们实例化对象,例如
Foo fooObject("first);
f.DoSomething();//it will prints out first
同样,将传递给 Foo 构造函数的字符串将在调用 DoSomething() 时打印。
因为例如在上面示例的 DoSomething() 中,“this”表示 fooObject,而在 do_something_to_a_foo() 中,fooObject 是通过引用传递的。
会计。Balaguruswamy 用 c++ 进行面向对象编程
this
是一个指针,指向this
调用函数的对象。例如,函数调用A.max()
会将指针设置this
为对象的地址。指针this
充当所有成员函数的隐式参数。
你会在this
这里找到一个很好的指针示例。它也帮助我理解了这个概念。
http://www.learncpp.com/cpp-tutorial/8-8-the-hidden-this-pointer/
非静态成员函数,例如Foo::DoSomething
有一个隐式参数,其值用于this
. 该标准在 C++11 §5.2.2/4 中指定了这一点:
调用函数时,每个参数 (8.3.5) 都应使用其对应的参数进行初始化 (8.5, 12.8, 12.1)。[注意:此类初始化彼此之间的顺序是不确定的(1.9)-结束注释]如果函数是非静态成员函数,则函数的
this
参数(9.3.2)应使用指向对象的指针进行初始化调用的,如同通过显式类型转换 (5.4) 进行转换。
因此,您需要一个Foo
对象来调用DoSomething
. 该对象简单地变为this
。
this
关键字和普通的、显式声明的指针参数之间的唯一区别(而且是微不足道的)const
是您不能获取this
.
它是一个本地指针。它将当前对象称为本地对象