繁体   English   中英

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

[英]-> operator not allowed on statically allocated objects in C++?

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

讲师说的类似“箭头运算符与点运算符等效,除了动态分配的对象。您只能在静态分配的对象上使用点运算符[其后为在块的开头声明变量的示例],则只能使用箭头运算符动态分配用new制作的对象。”

C ++绝对不是我的专业领域...但是我看过的所有其他内容都说a->b等同于*ab ,并且它的存在主要是出于遗留原因,因为变量在C ++的早期版本中的作用不同。

确实->不能用于指向在堆栈上分配的对象的指针,并且->不能用于该指针. 不能在指向堆上分配的对象的取消引用的指针上使用?

您的讲师的答案是不正确的,它概括了一些常见的基本情况,但也表明他(或她)实际上没有用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,这样. 再次工作。 而且您可能有一个指针,该指针指向已在堆栈或堆上分配的object ,因此使用->访问。

总而言之, . 用于访问非指针, ->用于访问指针。 另外,可能有些类具有operator->重载的类。 然后,您还可以使用该运算符访问类的非指针实例。

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!

老师错了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM