我正在尝试在C ++中创建2D点向量。我的问题是在使用std :: vector存储点之前是否需要为2D点定义复制构造函数,赋值运算符和默认构造函数? 另外,如何为std库中定义的向量重载运算符/使其成员函数? 感谢您的帮助:)
答案 0 :(得分:2)
用户定义的类型始终需要良好的复制语义。即使没有将它们放入向量中,也是如此。将一个对象复制到另一个对象的含义各不相同,但是很明显,一个要求是这样做不会使程序崩溃。因此,真正的问题是用户定义的类型是否具有良好的复制语义。显然,看不到类型很难说。
如果您有一个简单的类型,例如struct Point { int x, y; };
,则该类型已经具有良好的复制语义,您无需执行其他任何操作。如果您的类包含本身具有良好复制语义的其他对象,则同样适用,因此,如果您想在类型中包含std::string
,例如, struct NamedPoint { std::string name; int x, y; };
通常,当类必须在析构函数中执行某些操作(例如删除一些内存)时,就会出现问题。然后,您需要编写一个赋值运算符并复制构造函数。
可以找到更多详细信息here。
与您链接的讨论有些困惑。
答案 1 :(得分:1)
我的问题是在使用std :: vector存储点之前是否需要为2D点定义复制构造函数,赋值运算符和默认构造函数?
来自cppreference:
T必须满足CopyAssignable和CopyConstructible的要求。 (直到C ++ 11)
对元素施加的要求取决于对容器执行的实际操作。通常,要求元素类型是完整类型并满足Erasable的要求,但是许多成员函数提出了更严格的要求。 (自C ++ 11起)(直到C ++ 17)
对元素施加的要求取决于对容器执行的实际操作。通常,要求元素类型满足Erasable的要求,但是许多成员函数提出了更严格的要求。如果分配器满足分配器完整性要求,则可以使用一个不完整的元素类型实例化此容器(但不能使用其成员)。 (自C ++ 17起)
通常,是的,您需要一个复制构造函数,一个赋值运算符和一个默认构造函数。但是可以隐式提供它们,这意味着它们将由编译器生成。查看this question,以了解在什么情况下隐式定义了什么。
此外,如何为std库中定义的向量重载运算符/使其成员函数?
你不知道。标准库不得修改;充其量,您可以在某些情况下将一些代码添加到std
命名空间中,但这不是其中之一。