- >不允许在C ++中静态分配对象的运算符?

时间:2016-03-15 20:12:55

标签: c++ syntax

我是一名自学成才的程序员,第一次参加正式的大学程序设计课程。今天有人在C ++类中向教师询问->运算符的作用。

教师说“箭头操作符相当于点操作符除了动态分配的对象之外的东西。你只能在静态分配的对象上使用点运算符[后跟一个在开头声明变量的例子]一个块],你只能使用箭头操作符动态分配你用new创建的对象。“

C ++绝对不是我的专业领域......但我所看到的所有其他事情a->b完全等同于*a.b,而且它主要是出于传统原因而存在,因为变量有效在早期版本的C ++中有所不同。

是否真的->不能用于指向堆栈上分配的对象的指针,并且.不能用于指向堆上分配的对象的解引用指针?

2 个答案:

答案 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!

老师错了。