C++ 复制构造函数-c++;

C++ 复制构造函数-c++;,c++,copy,constructor,C++,Copy,Constructor,我可以通过只传入指针而不是常量引用来编写副本构造函数吗?(如果我确保不更改任何值,可以吗?) 像这样: SampleClass::SampleClass(SampleClass* p) { //do the necessary copy functionality } 而不是: SampleClass::SampleClass(const SampleClass& copyObj) { //do the necessary copy } 提前谢谢 谢谢大家。因此,如果我编写一个

我可以通过只传入指针而不是常量引用来编写副本构造函数吗?(如果我确保不更改任何值,可以吗?)

像这样:

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

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



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

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

您可以编写一个将指针作为参数的构造函数。
但是复制构造函数是我们给特定构造函数的名称。

将同一类的引用(最好是const,但不是必需的)作为参数的构造函数被命名为copy构造函数,因为它实际上就是这样做的。

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

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

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

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

除了它不会是副本构造函数,并且编译器将生成副本构造函数,除非您显式禁用它之外,没有任何好处,也没有太多漏洞。空指针之外的构造函数的正确语义是什么?这会给类的用户增加什么?(提示:没什么,如果她想从堆对象中构造,她可以取消对指针的引用并使用常规复制构造函数)。

复制构造函数隐式用于两种情况:

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

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

您可以编写完全有效的副本构造函数,并且仍然能够传递空引用。您可以测试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!
MyClass::MyClass(MyClass常量和MyClassCopy)

:somevar(MyClassCopy.somevar)//如果不调用代码中未定义的行为,则无法获取null引用。在事实发生后测试NULL是没有用的,因为错误在其他代码中。事实上,编译器可以在(&MyClassCopy==NULL)
的情况下优化测试
,因为它永远不会发生在正确的程序中。我同意取消对NULL指针的引用是无效的操作,对NULL的测试最好在取消引用操作之前完成。但是,由于NULL可以在运行时分配,因此大多数编译器将允许您创建NULL引用,并且编译器无法检查它。或优化空输出测试。您可以使用g++进行测试,测试工作正常。经过一段时间的思考,您是正确的,您必须在取消引用操作之前测试null。事后检验确实是不明确的。