【发布时间】:2011-11-12 17:37:36
【问题描述】:
可能重复:
What is the difference between the dot (.) operator and -> in C++?
两者有什么区别?你什么时候用一个代替另一个?
有一次我尝试使用 '->' 而不是 '.'我得到“左操作数有'类'类型,使用'。'”错误,这是什么意思?
【问题讨论】:
标签: c++
可能重复:
What is the difference between the dot (.) operator and -> in C++?
两者有什么区别?你什么时候用一个代替另一个?
有一次我尝试使用 '->' 而不是 '.'我得到“左操作数有'类'类型,使用'。'”错误,这是什么意思?
【问题讨论】:
标签: c++
. 允许您访问类的成员。以thingy.member 为例。
如果你有一个指向你的类的指针,比如pThingy,你需要取消引用它才能访问成员。喜欢(*pthingy).member。
取消引用/访问组合的快捷方式是->: pThingy->member。
【讨论】:
所有这些答案在狭窄的范围内都是正确的。即使没有指针,也可以使用 -> 运算符,因为可以重载它。看看智能指针:
class A
{
public:
void foo();
}
class SmartPtr
{
public:
SmartPtr (A& obj)
{
instance = obj;
}
A instance;
A operator-> ()
{
return instance;
}
};
那么你可以这样做:
A a;
SmartPtr smart(a);
smart->foo();
所以你可以使用 -> 即使 SmartPtr 不是指向 SmartPtr 类型对象的指针。
此答案是对先前答案的补充,因为它们可能具有误导性。在一个简单的情况下,它们都是正确的。请注意,dot(.) 运算符不能重载。
【讨论】:
. 在对象是T 类型时使用。 -> 如果对象是 T* 类型。
class foo {};
foo obj;
obj 类型为foo,它位于堆栈上。因此,要访问它的成员,需要使用 . 运算符。
foo *hObj = new foo();
hObj 是一个指向对象的指针。因此,要访问它的成员,需要使用 -> 运算符。
【讨论】:
您使用object.property 来获取对象的属性。但是,如果您有一个指向对象的指针(我们称之为pointer_to_object),那么您将使用-> 来访问它的属性:pointer_to_object->property
您收到错误的原因是因为语句pointer_to_object->property 将首先尝试取消对实际对象的引用,然后访问其属性。如果变量不是指向对象的指针,则会出现错误。
【讨论】:
x->blah 是写(*x).blah 的一个很好的原因。那就是它取消引用一个指针,然后访问成员blah。如果 x 不是指针,则表示编译时错误。
【讨论】:
如果 a 是指针(或提出“指针语义”的对象),则认为 a->b 为 (*a).b
更一般地说,如果a 不是一个指针,它们是两个运算符:-> 是可覆盖的(所以它的作用取决于它应用的类,注意 class 作为一种类型,而不是指向类的指针:见上文),另一个是不可覆盖的成员选择(对非复合类型无意义),所以
a->b 表示 “通过调用 A::operator->() 返回的指针访问 b 成员 a”,
而a.b 表示“访问a 的b 成员”。
【讨论】: