C ++,类成员

时间:2016-02-15 07:08:45

标签: c++

假设我有两个班级。 Class1Class2的实例作为参数进行初始化。那么下面两行代码有什么区别?

据我所知,当您使用new时,会创建一些内存空间,您应该使用delete来擦除该内存。那么在这种情况下首先使用非标准是否安全?

Class1 c1(new Class2(argu));

Class1 c1(Class2(argu));

4 个答案:

答案 0 :(得分:1)

  

Class1 c1(new Class2(argu));

new运算符在Class2 object中分配heap,并且在它不再使用时必须记住delete,否则内存泄漏会发生。它将调用Class1(Class2 *p)构造函数。从技术上讲,你的构造函数必须存储该指针,以便以后删除它。

  

Class1 c1(Class2(argu));

此行创建一个临时对象Class2,并始终尝试首先调用接受临时Class1(Class2&& c)对象的Class2构造函数。

如果您没有,则会调用Class1(Class2& c) [通过参考]或Class1(Class2 c) [按值](您只能同时拥有其中一个)。< / p>

答案 1 :(得分:0)

new在堆上分配一个新实例并返回指向它的指针。为了接受它,你的构造函数应该被定义为Class1(Class2*)。第二个片段在堆栈上声明了一个新实例,并且可以通过引用Class1(Class2&)使用。

答案 2 :(得分:0)

  

那么下面两个代码有什么区别?

这取决于Class1的构造函数是如何实现的。为了第一个建设成功;

Class1::Class1(Class2* arg);

Class1需要通过指针接受参数(也可能const)。需要进一步的文档来确定参数是否应该new或者是否只需要一个指针(如果使用了更多的C风格)。最有可能的是,对于现代惯用的C ++,它需要new

第二个构造函数需要引用或值;

Class1::Class1(const Class2& arg); // lvalue ref
Class1::Class1(Class2&& arg); // rvalue ref
Class1::Class1(Class2 arg); // value

第一种形式是复制构造函数,第二种形式是移动构造函数,它们都将绑定到创建的临时Class2对象。第三种形式是按价值,也将适当约束。

  

在这种情况下,首先使用非标准是否安全?

完全没有。如果将Class1构建为Class2资源的RAII类型类,那么此表单就是您所期望的。

注意在new的情况下,有人需要调用相应的delete以确保该类被破坏并释放内存。

答案 3 :(得分:-1)

使用new分配动态内存,用于第一行的指针。第二行声明了一个新实例。

您可能会阅读动态内存分配以及类 http://www.cplusplus.com/doc/tutorial/dynamic/