【发布时间】:2013-10-23 18:51:05
【问题描述】:
我想知道在什么情况下应该定义复制构造函数或赋值运算符。从我的研究中我看到,每当值是按值传递或按值返回时,都需要定义复制构造函数和重载赋值运算符。但是,当指针或引用通过指针或引用(&)传递/返回时,我们是否需要复制构造函数/重载赋值运算符
class Sample
{
public :
// Assume a constructor that sets the node member
SampleNode * getNode()
{
return _node;
}
private:
SampleNode * node;
}
class SampleNode
{
public:
void getValue()
{
return _value;
}
private:
unsigned int value;
}
main()
{
Sample * ptr = new Sample(15);
SampleNode *node = getNode(); // Do we need a copy constructor here?
}
【问题讨论】:
-
该代码毫无意义。你会得到大量的编译器错误。给出几个问题: 1. new Sample(15) 不能工作。没有合适的构造函数。 2.返回_node。未识别的标识符_node。 3.getNode();未识别的函数 getNode。等等等等。
-
您的示例在技术上具有未定义的行为(除非您将其与编译器错误一起修复),但请记住,如果您做对了,编译器通常会为您提供这些行为。
-
你应该了解rule of three
-
当您通过值而不是通过引用传递时使用复制构造函数/赋值。在这种情况下,您正在使用指针做所有事情。一款危险的游戏,但它确实可以让您避免担心复制构造函数。
-
对不起代码。我只是想出了一个示例代码,只是为了说明我的问题。这肯定会产生很多编译器错误。 @MadScienceDreams:你为什么说这是一个危险的游戏?请让我知道在编码时是否需要记住隐藏的角落案例
标签: c++