我知道this
指针在被调用时会隐式传递给成员函数。但是,当我尝试获取this
指针的地址(通过&this
)时,我得到编译器错误“需要左值”。为什么是这样?
class st
{
int a,b;
public :
void print()
{
cout << &this; //gives lvalue required... why?
cout << this; //will print address of object.
}
}
答案 0 :(得分:5)
&
不是左值,而是右值。来自[class.this]:
在非静态(9.3)成员函数的主体中,关键字这是一个prvalue 表达式,其值是调用该函数的对象的地址。类X的成员函数中的类型是X *。如果成员函数声明为const,则其类型为const X *,如果成员函数声明为volatile,则其类型为volatile X *,如果成员函数声明为const volatile,则此类型为const易变的X *。
强调我的
lvalue
需要this
,因此您无法获取{{1}}的地址。
答案 1 :(得分:0)
因为这个指针是一个右值。这个指针是一个常量值,它像局部变量一样传递给成员函数,因此它的值存储在一个内存位置,当从该函数返回时该位置将变为无效。
答案 2 :(得分:-1)
据推测,您正在尝试打印对象中的值。 cout不知道该怎么做,你必须教它。 cout&lt;&lt; *这个; 如果cout知道怎么做,可能会这样做,但你可以教它。这是一个更自然的c ++示例。 (您还应该考虑构造函数)。
#include <iostream>
using namespace std;
class st
{
public:
int a,b;
};
std::ostream& operator<<(std::ostream& s, const st& val)
{
return s << "a:" << val.a << " b:" << val.b ;
}
int main() {
st foo;
foo.a = 1;
foo.b = 2;
cout << "foo is " << foo << endl;
}