我是一名自学成才的程序员,第一次参加正式的大学程序设计课程。今天有人在C ++类中向教师询问->
运算符的作用。
教师说“箭头操作符相当于点操作符除了动态分配的对象之外的东西。你只能在静态分配的对象上使用点运算符[后跟一个在开头声明变量的例子]一个块],你只能使用箭头操作符动态分配你用new
创建的对象。“
C ++绝对不是我的专业领域......但我所看到的所有其他事情a->b
完全等同于*a.b
,而且它主要是出于传统原因而存在,因为变量有效在早期版本的C ++中有所不同。
是否真的->
不能用于指向堆栈上分配的对象的指针,并且.
不能用于指向堆上分配的对象的解引用指针?
答案 0 :(得分:7)
你的教师答案不正确,它概括了一些常见的基本案例,但它也表明他或她在用C ++编写大型项目时没有任何经验。原因如下:
如果在堆栈上分配对象,即使用C ++的自动内存,通常会执行以下操作:
SomeClass object;
object.doSomething();
如果在堆上分配内存,通常看起来像这样:
SomeClass* object = new SomeClass; // unique_ptrs are a better way but this might be easier to grab for now
object->doSomething();
delete object;
但您也可以通过引用引用对象,以便.
再次起作用。并且您可能有一个指针指向已在堆栈或堆上分配的object
,因此使用->
进行访问。
总而言之,.
用于访问非指针,->
用于访问指针。此外,可能存在operator->
重载的类。然后,您还可以使用该运算符访问类的非指针实例。
答案 1 :(得分:4)
a->b
(假设没有重载更改其语义)是(*a).b
。
如何分配*a
完全无关紧要。
以下是合法,有效和安全的(如果有点愚蠢):
std::string* str = new std::string("abc");
std::string& ref = *str;
const int n = ref.size();
// oh no! used dot on dynamically-allocated object!
老师错了。