C ++:具有重载构造函数的类的对象数组

时间:2013-07-11 15:45:55

标签: c++ arrays constructor copy-constructor constructor-overloading

假设我有一个“myclass”类 - :

class myclass
{
public:
    int n;
    myclass(int n=0)
    {
        this->n=n;
    }
    myclass(myclass &a)
    {
        this->n=a.n;
    }
    ~myclass()
    {
        cout<<n<<"\n";
    }
};  

现在我想创建一个“myclass”对象数组,如下所示 - :

int main()
{
    myclass arr[]= {5};  // Only 1 element for simplicity...
}

但是当我这样做时,我收到以下错误 - :

在函数'int main()'中:
| 47 |错误:没有用于调用'myclass :: myclass(myclass)'的匹配函数 | 47 |注意:候选人是:
| 36 |注意:myclass :: myclass(myclass&amp;)
| 36 |注意:参数1从'myclass'到'myclass&amp;'没有已知的转换 | 32 |注意:myclass :: myclass(int)
| 32 |注意:参数1从'myclass'到'int'

没有已知的转换

但是当我从课程中删除复制构造函数 myclass(myclass &a)时,我没有收到任何错误,一切正常......

所以现在我的问题是 - :

1)。为什么会这样? myclass(int n=0)不是比这里的复制构造函数更好的匹配吗?

2)。如何成功编译它,考虑到我想要两者,复制构造函数以及我的类中的整数构造函数?

注意:我在Ubuntu 13.04上使用GCC 4.7.3版(如果它有任何相关性。)

2 个答案:

答案 0 :(得分:2)

  

如何成功编译它,考虑到我同时需要复制构造函数以及我类中的整数构造函数?

const添加到复制构造函数的引用参数可以解决此问题:

myclass(const myclass &a) : n(a.n) {}

Demo on ideone

答案 1 :(得分:2)

这种情况下的初始化语义是copy 初始化。复制初始化正式转换 争论,然后复制它。转换后的争论不是一个 左值,所以它不能绑定到你的非const引用 复制构造函数。如果您没有定义复制构造函数, 编译器为你定义一个,它接受一个const 参考。你是复制构造函数应该采用const 引用也是如此,因为它不会修改它的参数。

请注意,允许编译器优化副本 施工。但是,只有该计划是合法的,如果它 没有。