复制构造函数 - c ++

时间:2009-04-14 03:27:41

标签: c++ copy constructor

我可以通过传入指针而不是const引用来编写复制构造函数吗? (如果我确定我不会改变任何值,那会没关系吗?)

像这样:

SampleClass::SampleClass(SampleClass* p)
{
 //do  the necessary copy functionality
}

而不是:

SampleClass::SampleClass(const SampleClass& copyObj)
{
//do the necessary copy
}

提前致谢。


谢谢大家。所以,如果我编写一个接受指针的构造函数(并认为这是我的复制构造函数),编译器仍然会提供默认的复制构造函数,在这种情况下,我的构造函数(我认为是我的复制构造函数)将不会被调用,将调用默认的复制构造函数。明白了。

9 个答案:

答案 0 :(得分:19)

是的,你可以编写一个带有指向对象的指针的构造函数。但是,它不能称为复制构造函数。复制构造函数的定义要求您传递同一类的对象。如果你传递任何其他东西,是的,它是一个构造函数,但不是复制构造函数。

答案 1 :(得分:4)

您可以编写一个以指针作为参数的构造函数 但是复制构造函数是我们给出特定构造函数的名称 采用相同类作为参数的引用(最好是const但不是必需)的构造函数只是命名为复制构造函数,因为这是它实际上的作用。

答案 2 :(得分:2)

除了它不是一个复制构造函数,并且编译器将生成复制构造函数,除非你明确地禁用它,没有什么可以获得和松散。空指针中构造函数的正确语义是什么?这会给你的班级用户带来什么? (提示:没有,如果她想构建一个堆对象,她可以取消引用指针并使用常规的复制构造函数)。

答案 3 :(得分:1)

没有。复制构造函数必须使用引用,而不是指针,如果它对于传值等有用。

答案 4 :(得分:1)

根据定义,copy ctor使用const引用。虽然没有什么可以阻止你编写带有指针的ctor,但它会引发一些在使用引用时不存在的问题 - 例如,如果传入空指针应该/可能发生什么?

答案 5 :(得分:1)

复制构造函数需要引用,因为值参数需要复制,这将调用复制构造函数,复制构造函数将生成其参数的副本,该参数将调用复制构造函数,...

答案 6 :(得分:1)

您可以编写类似的构造函数,但从技术上讲它不是复制构造函数。例如,STL容器仍将使用编译器生成的复制构造函数(编译器生成一个,因为您没有编写一个)。

答案 7 :(得分:1)

在两种情况下隐式使用复制构造函数:

  • 当您的类的实例按值传递给函数时。
  • 当一个函数的值返回一个类的实例时。

正如其他人所提到的,你可以编写一个带有描述签名的构造函数(或使用const指针),但它不会用于上述任何一种情况。

答案 8 :(得分:-1)

您可以编写完全有效的复制构造函数,并且仍然可以传递NULL引用。您可以测试NULL,但前提是您不使用构造函数初始化列表。

示例:

MyClass::MyClass( MyClass const& MyClassCopy )
: somevar( MyClassCopy.somevar ) // <- the init list goes here.
{
   // If MyClassCopy is NULL, the initialization above is doomed!
   // However we can check for NULL in the constructor body but
   // the initialization list must be removed ...
   if (&MyClassCopy == NULL ) throw( std::runtime_error("NULL pointer!"));
   somevar = MyClassCopy.somevar;
}

// I'll now do some very dangerous programming to
// demonstrate one way that a NULL can get through ...
MyClass* P = NULL;
MyClass A( *P ); // Bang, you're dead!

据我所知,没有办法从初始化列表中检查NULL,所以如果你认为最终会遇到NULL通过的情况,你必须在构造函数体中测试它并从那里做初始化。

不要忘记有一些带有:: operator =()函数的问题需要注意......