实例化一个类的首选方法是什么?

时间:2018-01-06 01:34:56

标签: java c++ pointers instantiation

我来自Java所以当我实例化一个类时,我会在c ++中执行此操作:

Class myClass;
myClass.print();

但是最近,我一直在使用指针和地址:

Class *pClass = new Class;
pClass->print();

我可以看到的第一个优势当然是删除pClass并释放内存。

delete pClass;

但除此之外,我已经习惯了这是我课程的第一种方式。这是不赞成的,我应该习惯用指针做这个吗?

3 个答案:

答案 0 :(得分:4)

避免动态分配(甚至隐藏在std :: make_unique / std :: make_shared中),除非你真正需要它来做你正在做的事情。话虽如此,有很多情况下这种分配是非常必要的。

答案 1 :(得分:0)

不,你不应该习惯用指针来做这件事"。

一般来说,如果有特殊需要,您应该只使用指针和动态内存分配。如果您无法确定特定需求,请不要这样做。

是的,在某些情况下,使用动态内存分配(和释放)是合适的。但这样做还带来了额外的要求,例如程序员REMEMBERING释放对象,或使用特定技术(例如智能指针而不是原始指针)来确保正确释放。除非你真的需要从头开始,否则没有必要接受满足这些额外要求的努力。

顺便提一下,运营商delete并不一定能释放内存"。就程序而言,它会导致动态分配的对象不再存在。但是,它并不一定会导致您的程序将内存使用回到例如主机操作系统。这些事情取决于主机操作系统的细节(例如操作系统及其内核模式驱动程序分配物理内存的请求有多贵?)以及编译器和标准库以及优化设置的详细信息(例如,您的编译器供应商愿意多少)权衡用户程序的额外内存使用量与运行时速度?)

答案 2 :(得分:0)

来自Java,我希望你说你在C ++中使用指针,因为Java的行为非常接近使用指针(除了你不要删除'任何东西)。如果你不处理Java原始类型,那么你肯定没有价值语义。

例如,以下Java:

Foo f1 = new Foo();
Foo f2 = f1;

等同于以下C ++:

Foo *f1 = new Foo();
Foo *f2 = f1;
... delete later

正如其他人所说的那样,最好在C ++中使用指针,但是如果你将Java代码转换为C ++,那你就会陷入很大的痛苦之中如果您不使用指针(或智能指针),则重写代码。