三法则。Copy 构造函数、赋值运算符实现 [已关闭]

Rule of Three. Copy Constructor, Assignment Operator Implementation [closed]

提问人:user2310042 提问时间:4/23/2013 最后编辑:johnuser2310042 更新时间:4/23/2013 访问量:956

问:

三法则。复制构造函数、赋值运算符实现

#include <iostream>
using namespace std;

class IntPart
{
public:
 IntPart(); // default constructor
 IntPart(int n); 

private:
 unsigned int* Counts;
 unsigned int numParts;
 unsigned int size;
};

IntPart::IntPart()
{
 Counts = new int[101] (); // allocate all to 0s
 numParts = 0;
}

IntPart::IntPart(int n)
{
 Counts = new int[n+1] (); // allocate all to 0s
 Counts[n] = 1;
 numParts = 1;
}

int main ()
{
 IntPart ip2(200);
 IntPart ip3(100);

 IntPart ip(ip2); // call default and copy constructor?

 IntPart ip4; // call default constructor
 ip4 = ip3;

 system("pause"); return 0;
}

显然,这需要有三法则。 你能帮我定义它们吗?

问题0.

IntPart ip(ip2);

这是否创建调用默认构造函数的 ip 对象 之后,调用 copy constructor? 我说得对吗?

问题1.定义析构函数。

IntPart::~IntPart()
{ delete [] Counts; }

这是对的吗?

问题2.定义复制构造函数。

IntPart::IntPart(const IntPart& a)
{ // how do I do this? I need to find the length... size.... could anybody can do this?
}

问题3.定义赋值运算符。

IntPart& IntPart::operator= (const IntPart& a)
{
  if ( right != a)
  {
    // Anybody has any idea about how to implement this?
  }
  return *this;
}

谢谢 我将不胜感激!

C++ 析构函数 复制构造函数赋 值运算符 三法则

评论

3赞 WhozCraig 4/23/2013
实际上,Web 上有数以百万计的示例对象实现遵循三法则。仅在这个网站上就有数千人。看到右边的“相关”列表了吗?尝试单击它。职 训 局。
0赞 Bo Persson 4/23/2013
如果需要,可能会分配空间并从 .可能首先删除旧的(如果它太小)。Countsa.CountsCounts
0赞 Tony Delroy 4/23/2013
什么是三法则的可能副本?
1赞 Mike Seymour 4/23/2013
还要记住零法则。通过使用已实现这三个类型的资源管理类型(在本例中为 ),你自己的类型将不需要其中任何一个。std::vector<int>

答:

3赞 john 4/23/2013 #1

问题0.否,这仅调用复制构造函数。这是一个相当大的误解,物体只被构造一次

问题1.没错

问题2.据推测,您打算将数组大小存储在 中。例如size

IntPart::IntPart()
{
    Counts = new int[101] (); // allocate all to 0s
    numParts = 0;
    size = 101; // save array size
}

如果不将数组大小存储在某个地方,则无法编写复制构造函数。

问题3.我会查找副本并交换成语。这允许您使用 copy 构造函数编写赋值运算符。