当我们为一个类定义一个复制构造函数时,我们必须显式定义一个默认构造函数吗?请说明理由。
例如:
class A
{
int i;
public:
A(A& a)
{
i = a.i; //Ok this is corrected....
}
A() { } //Is this required if we write the above copy constructor??
}; 此外,如果我们为除复制构造函数之外的类定义任何其他参数化构造函数,我们是否也必须定义默认构造函数??考虑上面不带复制构造函数的代码,并将其替换为
A(int z)
{
z.i = 10;
}Alrite....After看到答案,我写了下面的程序。
#include <iostream>
using namespace std;
class X
{
int i;
public:
//X();
X(int ii);
void print();
};
//X::X() { }
X::X(int ii)
{
i = ii;
}
void X::print()
{
cout<<"i = "<<i<<endl;
}
int main(void)
{
X x(10);
//X x1;
x.print();
//x1.print();
}ANd这个程序在没有默认构造函数的情况下似乎工作得很好。请解释一下为什么会这样?我真的很困惑这个概念……
发布于 2009-10-18 18:52:18
是。一旦显式声明了类的任何构造函数,编译器就会停止提供隐式的默认构造函数。如果您仍然需要默认构造函数,则必须自己显式声明和定义它。
附注:可以编写一个复制构造函数(或转换构造函数,或任何其他构造函数),它也是默认构造函数。如果您的新构造函数属于该类别,则不再需要提供额外的默认构造函数:)
例如:
// Just a sketch of one possible technique
struct S {
S(const S&);
S(int) {}
};
S dummy(0);
S::S(const S& = dummy) {
}在上面的例子中,复制构造函数同时是默认的构造函数。
发布于 2009-10-18 18:56:23
您不必同时定义这两种类型。但是,一旦为类定义了任何构造函数,所有默认的构造函数都将不可用。因此,如果你想同时复制构造和不复制构造,你也需要定义一个非默认(即显式)默认(即无参数)构造函数。
如果你定义了一个复制构造函数,你通常也应该重写赋值操作符。
发布于 2009-10-18 23:29:34
正如AndreyT所说,如果显式声明任何构造函数,包括复制构造函数,编译器将不会隐式声明或定义默认构造函数。
这并不总是一个问题。
如果您不希望您的类是默认可构造的,那么完全可以不声明默认构造函数。但是,如果您希望它是默认可构造的(例如,如果您想取消注释示例中的X x1;行),那么您必须声明并定义一个默认构造函数。
还要注意,默认构造函数是任何可以不带参数调用的构造函数,而不仅仅是没有参数的构造函数。X::X(int = 5)是一个非常好的默认构造函数。
https://stackoverflow.com/questions/1585708
复制相似问题