我可以通过传入指针而不是const引用来编写复制构造函数吗? (如果我确定我不会改变任何值,那会没关系吗?)
像这样:
SampleClass::SampleClass(SampleClass* p)
{
//do the necessary copy functionality
}
而不是:
SampleClass::SampleClass(const SampleClass& copyObj)
{
//do the necessary copy
}
提前致谢。
谢谢大家。所以,如果我编写一个接受指针的构造函数(并认为这是我的复制构造函数),编译器仍然会提供默认的复制构造函数,在这种情况下,我的构造函数(我认为是我的复制构造函数)将不会被调用,将调用默认的复制构造函数。明白了。
答案 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 =()函数的问题需要注意......