繁体   English   中英

C ++,班级成员

[英]C++, class member

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

据我所知,当您使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM