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)
我似乎无法在那里找到解释,为什么它这样做.
为什么我要以这种方式指向一个类,而不是使用标准的方式呢?
有什么不同?哪种情况会更好?
谢谢.
首先,您不是指向类,而是指向类的实例,也称为对象.(如果你问我的话,在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.