首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复制构造函数和默认构造函数

复制构造函数和默认构造函数
EN

Stack Overflow用户
提问于 2009-10-18 18:49:33
回答 4查看 22K关注 0票数 14

当我们为一个类定义一个复制构造函数时,我们必须显式定义一个默认构造函数吗?请说明理由。

例如:

代码语言:javascript
复制
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??
};      

此外,如果我们为除复制构造函数之外的类定义任何其他参数化构造函数,我们是否也必须定义默认构造函数??考虑上面不带复制构造函数的代码,并将其替换为

代码语言:javascript
复制
A(int z)
{
    z.i = 10;
}

Alrite....After看到答案,我写了下面的程序。

代码语言:javascript
复制
#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这个程序在没有默认构造函数的情况下似乎工作得很好。请解释一下为什么会这样?我真的很困惑这个概念……

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-10-18 18:52:18

是。一旦显式声明了类的任何构造函数,编译器就会停止提供隐式的默认构造函数。如果您仍然需要默认构造函数,则必须自己显式声明和定义它。

附注:可以编写一个复制构造函数(或转换构造函数,或任何其他构造函数),它也是默认构造函数。如果您的新构造函数属于该类别,则不再需要提供额外的默认构造函数:)

例如:

代码语言:javascript
复制
// Just a sketch of one possible technique    
struct S {
  S(const S&);
  S(int) {}
};

S dummy(0);

S::S(const S& = dummy) {
}

在上面的例子中,复制构造函数同时是默认的构造函数。

票数 33
EN

Stack Overflow用户

发布于 2009-10-18 18:56:23

您不必同时定义这两种类型。但是,一旦为类定义了任何构造函数,所有默认的构造函数都将不可用。因此,如果你想同时复制构造和不复制构造,你也需要定义一个非默认(即显式)默认(即无参数)构造函数。

如果你定义了一个复制构造函数,你通常也应该重写赋值操作符。

票数 3
EN

Stack Overflow用户

发布于 2009-10-18 23:29:34

正如AndreyT所说,如果显式声明任何构造函数,包括复制构造函数,编译器将不会隐式声明或定义默认构造函数。

这并不总是一个问题。

如果您不希望您的类是默认可构造的,那么完全可以不声明默认构造函数。但是,如果您希望它是默认可构造的(例如,如果您想取消注释示例中的X x1;行),那么您必须声明并定义一个默认构造函数。

还要注意,默认构造函数是任何可以不带参数调用的构造函数,而不仅仅是没有参数的构造函数。X::X(int = 5)是一个非常好的默认构造函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1585708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档