C++指向类

Dfs*_*hgh 1 c++ methods pointers class operators

我现在正在阅读一本C++书籍,我对指向课程感到有些困惑.

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

Calculator myCalc;
myCalc.launch();

while( myCalc.run() ){
    myCalc.readInput();
    myCalc.writeOutput();
}
Run Code Online (Sandbox Code Playgroud)

但是,现在改为这样做:

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

while( myCalc -> run() ){
    myCalc -> readInput();
    myCalc -> writeOutput();
}
Run Code Online (Sandbox Code Playgroud)

我似乎无法在那里找到解释,为什么它这样做.

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

有什么不同?哪种情况会更好?

谢谢.

Jon*_*fer 7

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

不同之处在于分配对象的位置.当你做的时候:

Calculator myCalc;
Run Code Online (Sandbox Code Playgroud)

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

当你这样做时:

Calculator *myCalc;
Run Code Online (Sandbox Code Playgroud)

除了在堆栈上分配指针之外,没有太多事情发生.指针通常为4或8字节(32位与64位架构),仅保存内存地址.您必须通过执行以下操作来分配对象并使指针指向它:

myCalc = new Calculator;
Run Code Online (Sandbox Code Playgroud)

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

此外,您不能将指针或引用传递给其作用域之外的堆栈上的对象,因为当作用域结束时(例如,在函数的末尾),堆栈将被清除,因此对象变得不可用.

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

delete myCalc;
Run Code Online (Sandbox Code Playgroud)

总而言之:对于不留下范围的小而短的生物对象,可以使用基于堆栈的分配,而对于较大的长生命对象,堆通常是更好的去处.


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

  • @Linuxios:如果奶奶有钢丝,我们或许可以称她为雨伞.让我们在这里实用,而不是通过使讨论过于笼统而增加混乱,恕我直言. (3认同)