堆和栈的区别 拷贝构造函数、构造函数和赋值语句的区别?
拷贝构造函数、构造函数和赋值语句的区别?
像这样编写构造函数没什么错,但通常使用const。例如,调用非常量构造函数没有问题:
错误原因是func()返回一个rvalue,它不能绑定到非常量构造函数,但可以是常量构造函数。
在类a中定义复制构造函数后,编译器将不再生成默认常量构造函数,因此无法找到合适的复制构造函数。
什么是拷贝构造函数?拷贝构造函数何时被调用?
在C中,以下三种对象需要调用复制构造函数(有时也称为“复制构造函数”):
1)作为函数参数的对象通过值传递传递传递到函数体中;
2)作为函数返回值的对象通过值传递从函数返回;
3)使用对象初始化另一个对象(通常称为赋值初始化);直接调用函数和在定义时定义后续调用有什么区别?这不是区别。困难的方法是在编译器复制S1时调用S2复制方法。
有自己定义拷贝构造函数的必要吗?
1确实提供了复制构造函数,但此函数严格按位复制。一旦类中有动态分配成员,这将是一个问题(通常称为深度复制),这是不正确的
2如果没有动态分配成员,这是不必要的。但是动态分配成员是必要的,也是必要的,它还需要完成赋值运算符和析构函数的重载,这样当有动态分配成员时就不会有内存泄漏
当一个初始化的自定义类类型对象被用来初始化另一个新构造的对象时,会自动调用复制构造函数。换句话说,当需要复制类的对象时,将调用复制构造函数。在以下情况下将调用复制构造函数:通过值传递将对象传递到函数体中,通过值传递从函数返回对象。一个对象需要由另一个对象初始化。如果复制构造函数没有在类中显式声明,编译器将自动生成一个默认的复制构造函数,它完成对象之间的位复制(浅层复制)。在某些情况下,类中的成员变量需要动态打开堆内存。如果实现了位复制,也就是说,一个对象中的值被完全复制到另一个对象,比如a=B。此时,如果B中的成员变量指针已经应用了内存,那么a中的成员变量也指向同一个内存块。这会导致一个问题:当B释放内存(例如destruct)时,a中的指针是一个野生指针,并且会发生运行错误。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。