[英]-> 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.