10

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

像这样:

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

代替:

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

提前致谢。


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

4

9 回答 9

19

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

于 2009-04-14T03:33:50.053 回答
4

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

于 2009-04-14T03:33:32.270 回答
2

除了它不是一个复制构造函数并且编译器将生成复制构造函数,除非你明确禁用它之外,没有什么可得到的,也没有什么可失去的。使用空指针的构造函数的正确语义是什么?这对您班级的用户有什么好处?(提示:没什么,如果她想用堆对象构造,她可以取消引用指针并使用常规的复制构造函数)。

于 2009-04-14T06:31:28.130 回答
1

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

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

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

于 2009-04-14T12:41:56.897 回答
1

不,复制构造函数必须采用引用,而不是指针,如果它对按值传递等有用的话。

于 2009-04-14T03:31:46.470 回答
1

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

于 2009-04-14T03:33:52.020 回答
1

复制构造函数需要引用,因为值参数需要进行复制,这将调用复制构造函数,该复制构造函数将复制其参数,该参数将调用复制构造函数,...

于 2009-04-14T03:34:09.630 回答
1

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

于 2009-04-14T03:34:59.737 回答
-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=() 函数有一些注意事项......

于 2011-11-03T05:43:42.497 回答