gpt4 book ai didi

C++ 指向类

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:23:03 25 4
gpt4 key购买 nike

我正在阅读一本 C++ 书籍,我对指向类有点困惑。

本书前面的示例以这种方式使用类和方法:

Calculator myCalc;
myCalc.launch();

while( myCalc.run() ){
myCalc.readInput();
myCalc.writeOutput();
}

不过现在改成了这样:

Calculator* myCalc = new Calculator;
myCalc -> launch();

while( myCalc -> run() ){
myCalc -> readInput();
myCalc -> writeOutput();
}

而且我似乎无法在那里找到关于为什么这样做的解释。

为什么我要以这种方式指向一个类,而不是使用标准的方式呢?

有什么区别?哪种情况更可取?

谢谢。

最佳答案

首先,您不是指向类,而是指向类的实例,也称为对象。 (在 C++ 中,指向类是不可能的,如果你问我的话,这是它的缺陷之一)。

区别在于分配对象的地方。当你在做的时候:

Calculator myCalc;

整个对象是在 stack 上创建的.堆栈是局部变量、嵌套调用等的存储空间,通常限制在 1 MB 或更低。另一方面,堆栈上的分配速度更快,因为不涉及内存管理器调用。

当你这样做时:

Calculator *myCalc;

除了一个Pointer分配在堆栈上。指针的大小通常为 4 或 8 个字节(32 位与 64 位体系结构)并且仅包含一个内存地址。您必须分配一个对象并通过执行以下操作使指针指向它:

myCalc = new Calculator;

也可以合并成一行,如您的示例所示。在这里,对象分配在 heap 上,它大约和你的物理内存一样大(不考虑交换空间和架构限制),所以你可以在那里存储更多的数据。但它比较慢,因为内存管理器需要启动并在堆上为您的对象找到一个空闲位置,甚至需要从操作系统获取更多内存。现在指针 myCalc 包含对象的内存地址,因此它可以与 *-> 运算符一起使用。

此外,您不能将指针或引用传递给 堆栈 上对象的范围之外的对象,因为堆栈将在范围结束时(例如,在函数结束时)被清理,因此对象变得不可用。

哦,差点忘了提。堆上的对象不会自动销毁,因此您必须像这样手动删除它们*:

delete myCalc;

总结一下:对于不会离开其作用域的小而短生命周期的对象,您可以使用基于堆栈的分配,而对于大而长生命周期的对象,堆通常是更好的去处。


*:嗯,理想情况下,不是那样。使用智能指针,例如 std::unique_ptr .

关于C++ 指向类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11592988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com