复制运算符为的构造函数
copy constructor with operator=
我在这里得到了这个代码:
class DerivedClass : public BaseClass {
SomeClass* a1;
Someclass* a2;
public:
//constructors go here
~DerivedClass() { delete a1; delete a2;}
// other functions go here ....
};
我的第一个问题如下:
- 我可以给"DerivedClass"写一个"operator="吗?(如果你的答案是肯定的,你能告诉我怎么做吗?)
我的第二个问题是:
- 如果上面的答案是肯定的,你能告诉我如何使用你事先写的"operator="制作一个"复制构造函数"吗(如果可能的话)
以下是编写复制构造函数和赋值运算符的最佳方法,遵循"零规则":
#include <optional>
class DerivedClass : public BaseClass
{
std::optional<SomeClass> a1;
std::optional<SomeClass> a2;
public:
//constructors go here
};
编译器将为析构函数、复制构造函数和复制赋值运算符编写正确的代码。如果SomeClass
是可移动的,您将免费获得移动赋值和移动构造函数。
如果SomeClass
是多态的,您将需要一个clone()
函数,就像前面提到的BogoIt一样。但即使在这种情况下,使用智能指针也是有价值的(std::unique_ptr
是合适的)。
复制ctor和op=的主体取决于您计划存储资源的方式:a1和a2变量。如果您需要将它们复制到另一个类,那么您应该编写一些函数来完整复制SomeClass对象。另一种情况是,您可以简单地复制指针值,但要非常小心使用它们的方式,尤其是删除它们。共享资源问题最简单的解决方案是使用一些智能指针,例如boost::shared_ptr或c++11 std::shared-ptr。
因此,如果你计划复制你的资源:
class DerivedClass : public BaseClass {
SomeClass* a1;
Someclass* a2;
public:
// note: do not forget to assign zeroes to your pointers, unless you use some kind of smart pointers
DerivedClass()
:a1(0), a2(0){}
DerivedClass(const DerivedClass& d)
:a1(0), a2(0)
{
*this = d;
}
DerivedClass& operator=(const DerivedClass& d)
{
if (this == &d)
return *this;
delete a1;
a1 = d.a1->clone();
delete a2;
a2 = d.a2->clone();
return *this;
}
//constructors go here
~DerivedClass() { delete a1; delete a2;}
// other functions go here ....
};
您还需要SomeClass的clone()函数,它将复制您的对象:class SomeClass{公用:
SomeClass* clone() const
{
return new SomeClass();
}
};
相关文章:
- 构造函数和转换运算符之间的重载解析
- 复制构造函数、赋值运算符C++
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 为用户定义的类正确调用复制构造函数/赋值运算符
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- 为什么我的运算符 + 重载尽管是通过引用传递的,但仍调用我的复制构造函数?
- 让某个类的 '=' 运算符在声明时运行构造函数
- C++:使用运算符 = 调用多参数构造函数
- 应用于运算符而不是构造函数的显式关键字
- 运算符+ 的规范实现涉及额外的移动构造函数
- 运算符 new 的执行顺序和构造函数的参数
- 非模板 std::reference_wrapper赋值运算符和模板构造函数
- 如果我也使用复制构造函数并且重载 = 运算符,我是否需要析构函数?
- 复制构造函数和赋值运算符的值类实现
- 在构造函数中使用重载运算符?
- 在C++中,我可以在定义自己的复制构造函数后跳过定义赋值运算符吗?
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- C++ 类的构造函数和函数调用运算符 () 重载之间的歧义
- 删除了所有自动生成的构造函数/运算符的类仍然可以从函数返回吗
- 为简单结构定义哪个复制/移动构造函数/运算符