[英]C++, class member
假设我有两个班。 Class1
将Class2
的实例作为参数进行初始化。 那么下面的两行代码有什么区别?
据我所知,当您使用new
,会创建一些内存空间,您应该使用delete
删除该内存。 那么可以确定在这种情况下首次使用是非标准的吗?
Class1 c1(new Class2(argu));
Class1 c1(Class2(argu));
Class1 c1(new Class2(argu));
new
运算符在heap
分配Class2 object
,您必须记住在不再使用它时将其delete
,否则会发生内存泄漏。 它将调用Class1(Class2 *p)
构造函数。 从技术上讲,您的构造函数必须存储该指针,以便以后将其删除。
Class1 c1(Class2(argu));
该行创建一个临时对象Class2
,并将始终尝试调用首先接受临时Class2
对象的Class1(Class2&& c)
构造函数。
如果你没有一个,它会调用Class1(Class2& c)
[由参]或Class1(Class2 c)
[按值(你只能在同一时间其中之一)。
new
在堆上分配一个新实例并返回指向它的指针。 为了接受它,您的构造函数应定义为Class1(Class2*)
。 第二个片段在堆栈上声明一个新实例,并且可以通过引用Class1(Class2&)
。
那么下面的两个代码有什么区别?
这取决于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
第一种形式是复制构造函数,第二种形式是move构造函数,两者都将绑定到创建的临时Class2
对象。 第三种形式是按值,并且也将适当地绑定。
那么可以确定在这种情况下首次使用是非标准的吗?
一点也不。 如果将Class1
构建为Class2
资源的RAII类型类,则您将期望使用这种形式。
请注意,对于new
,有人需要调用相应的delete
来确保该类被销毁并释放内存。
使用new分配动态内存,该动态内存用于第一行的指针。 第二行声明一个新实例。
您可能会阅读有关动态内存分配以及类http://www.cplusplus.com/doc/tutorial/dynamic/的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.