c ++在复制构造函数中使用const?

时间:2012-03-23 23:22:11

标签: c++ copy-constructor

我从未写过复制构造函数,所以为了避免痛苦,我想知道我编码的内容是否合法。它编译但我不确定它是否可以作为复制构造函数。

此外,我必须在复制构造函数中使用const,否则我可以简单地删除它。 (我不喜欢const的是编译器如果我使用了一些非const函数就会哭。)

//EditNode.h
class EditNode
{
      explicit EditNode(QString elementName);
      EditNode(const EditNode &src);
}

//EditNodeContainer.h
class EditNodeContainer : public EditNode
{
      explicit EditNodeContainer(QString elementName);
      EditNodeContainer(const EditNodeContainer &src);
}

//EditNodeContainer.cpp
EditNodeContainer::EditNodeContainer(QString elementName):EditNode(elementName)
{
}       

//This seems to compile but not sure if it works
EditNodeContainer::EditNodeContainer(const EditNodeContainer &src):EditNode(src)
{

}


//the idea whould be to do something like this
EditNodeContainer *container1 = new EditNodeContainer("c1");
EditNodeContainer *copyContainer = new EditNodeContainer(container1);

3 个答案:

答案 0 :(得分:3)

复制构造函数是具有以下签名之一的构造函数:

class A
{
    A(A& other);
    //or
    A(const A& other);
    //or
    A(volatile A& other);
    //or
    A(const volatile A& other);
    //or any of the above + other parameters that have default arguments
    //example:
    A(const A& other, int x = 0) //this is also a copy constructor
};

以上内容在标准的 12.8.2 中指定 - C ++ 03。 所以你正确地实现了一个拷贝构造函数。

它应该收到const参数的原因是您没有更改要复制的对象。如果你在它上面调用非const函数,那你就做错了。

另外,在您的代码段

EditNodeContainer *container1 = new EditNodeContainer("c1");
EditNodeContainer *copyContainer = new EditNodeContainer(container1);

您没有调用复制构造函数,因为您传递EditNodeContainer*作为参数,而不是EditNodeContainer

答案 1 :(得分:1)

你错过了一个*符号。复制构造函数需要引用对象,但是给出了指向对象的指针。只需将container1替换为*container1作为复制构造函数的参数。

答案 2 :(得分:0)

复制构造函数的参数可以是对非const的左值引用或对const的左值引用,但实际上它始终是对const的引用(不推荐的auto_ptr是一个例外)。

除非您必须并且您完全理解其后果,否则不应编写复制构造函数。如果您在任何地方使用RAII类,那么您很少需要自定义复制构造函数(除非您正在编写RAII类)。

另外,请尽可能避免使用原始指针和new